diff options
author | kaiw <kaiw@FreeBSD.org> | 2010-07-21 09:47:14 +0000 |
---|---|---|
committer | kaiw <kaiw@FreeBSD.org> | 2010-07-21 09:47:14 +0000 |
commit | 57795d0388546ee51a052ad6d144abc3288508f5 (patch) | |
tree | 89fecbe337348ce494507450a43cc6a12c9ff80c /lib/libelf | |
parent | f349ce0e9e0d9b00fd5fa016a5b7cd1ec528a01c (diff) | |
download | FreeBSD-src-57795d0388546ee51a052ad6d144abc3288508f5.zip FreeBSD-src-57795d0388546ee51a052ad6d144abc3288508f5.tar.gz |
Allow an application that updates only the ELF Ehdr to work.
Obtained from: elftoolchain
MFC after: 1 month
Diffstat (limited to 'lib/libelf')
-rw-r--r-- | lib/libelf/_libelf.h | 1 | ||||
-rw-r--r-- | lib/libelf/elf_scn.c | 2 | ||||
-rw-r--r-- | lib/libelf/elf_update.c | 12 |
3 files changed, 8 insertions, 7 deletions
diff --git a/lib/libelf/_libelf.h b/lib/libelf/_libelf.h index 08185cc..3053bce 100644 --- a/lib/libelf/_libelf.h +++ b/lib/libelf/_libelf.h @@ -176,6 +176,7 @@ void (*_libelf_get_translator(Elf_Type _t, int _direction, int _elfclass)) void *_libelf_getphdr(Elf *_e, int _elfclass); void *_libelf_getshdr(Elf_Scn *_scn, int _elfclass); void _libelf_init_elf(Elf *_e, Elf_Kind _kind); +int _libelf_load_scn(Elf *e, void *ehdr); int _libelf_malign(Elf_Type _t, int _elfclass); size_t _libelf_msize(Elf_Type _t, int _elfclass, unsigned int _version); void *_libelf_newphdr(Elf *_e, int _elfclass, size_t _count); diff --git a/lib/libelf/elf_scn.c b/lib/libelf/elf_scn.c index 139f6d9..3a9e575 100644 --- a/lib/libelf/elf_scn.c +++ b/lib/libelf/elf_scn.c @@ -38,7 +38,7 @@ __FBSDID("$FreeBSD$"); /* * Load an ELF section table and create a list of Elf_Scn structures. */ -static int +int _libelf_load_scn(Elf *e, void *ehdr) { int ec, swapbytes; diff --git a/lib/libelf/elf_update.c b/lib/libelf/elf_update.c index a429036..2d7681f 100644 --- a/lib/libelf/elf_update.c +++ b/lib/libelf/elf_update.c @@ -472,6 +472,11 @@ _libelf_resync_elf(Elf *e) * file. */ + if (e->e_cmd != ELF_C_WRITE && + (e->e_flags & LIBELF_F_SHDRS_LOADED) == 0 && + _libelf_load_scn(e, ehdr) == 0) + return ((off_t) -1); + if ((rc = _libelf_resync_sections(e, rc)) < 0) return ((off_t) -1); @@ -726,14 +731,9 @@ _libelf_write_elf(Elf *e, off_t newsize) assert(phoff % _libelf_falign(ELF_T_PHDR, ec) == 0); assert(fsz > 0); + src.d_buf = _libelf_getphdr(e, ec); src.d_version = dst.d_version = e->e_version; src.d_type = ELF_T_PHDR; - - if (ec == ELFCLASS32) - src.d_buf = e->e_u.e_elf.e_phdr.e_phdr32; - else - src.d_buf = e->e_u.e_elf.e_phdr.e_phdr64; - src.d_size = phnum * _libelf_msize(ELF_T_PHDR, ec, e->e_version); |