diff options
author | Kai Wang <kaiw@FreeBSD.org> | 2010-07-21 09:47:14 +0000 |
---|---|---|
committer | Kai Wang <kaiw@FreeBSD.org> | 2010-07-21 09:47:14 +0000 |
commit | 7384c87800c52a2a403e1dec71a95fdc96b51f2f (patch) | |
tree | 89fecbe337348ce494507450a43cc6a12c9ff80c | |
parent | f44d4dafb4046944fb671536347816d6c56883ec (diff) |
Notes
-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 08185cc76c7f..3053bce5d25b 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 139f6d9f37e1..3a9e575c2322 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 a4290365d2e9..2d7681faf648 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); |