diff options
author | Chingis Dugarzhapov <chingis.dugarzhapov@amadeus.com> | 2014-04-10 16:52:50 (GMT) |
---|---|---|
committer | Chingis Dugarzhapov <chingis.dugarzhapov@amadeus.com> | 2014-04-10 16:52:50 (GMT) |
commit | 211ee2c00aeb4b0bc6ab33ad0ed34525d895069d (patch) | |
tree | 3ded88612bc5d8baac6bb1c473bde981ae628f00 /src | |
parent | b02d21f9b3926120249fefa9242ebcead94fc2dc (diff) | |
download | patchelf-211ee2c00aeb4b0bc6ab33ad0ed34525d895069d.zip patchelf-211ee2c00aeb4b0bc6ab33ad0ed34525d895069d.tar.gz patchelf-211ee2c00aeb4b0bc6ab33ad0ed34525d895069d.tar.bz2 |
Added assertion in TODO, removed some useless debug msgs...
Diffstat (limited to 'src')
-rw-r--r-- | src/patchelf.cc | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/src/patchelf.cc b/src/patchelf.cc index c0fdfdd..e0f74af 100644 --- a/src/patchelf.cc +++ b/src/patchelf.cc @@ -878,14 +878,21 @@ string ElfFile<ElfFileParamNames>::getInterpreter() template<ElfFileParams> string ElfFile<ElfFileParamNames>::getSoname() { - /* Simply searching for .dynamic section and getting its DT_SONAME entry content (if any) - TODO: add check of .dynstr <-> DT_STRTAB correspondance, as it's done in modifyRPath - TODO: for what is this check?? */ Elf_Shdr & shdrDynamic = findSection(".dynamic"); - Elf_Shdr & shdrDynStr = findSection(".dynstr"); char * strTab = (char *) contents + rdi(shdrDynStr.sh_offset); + /* Find the DT_STRTAB entry in the dynamic section. */ + Elf_Dyn * dyn = (Elf_Dyn *) (contents + rdi(shdrDynamic.sh_offset)); + Elf_Addr strTabAddr = 0; + for ( ; rdi(dyn->d_tag) != DT_NULL; dyn++) + if (rdi(dyn->d_tag) == DT_STRTAB) strTabAddr = rdi(dyn->d_un.d_ptr); + if (!strTabAddr) error("strange: no string table"); + + /* We assume that the virtual address in the DT_STRTAB entry + of the dynamic section corresponds to the .dynstr section. */ + assert(strTabAddr == rdi(shdrDynStr.sh_addr)); + Elf_Dyn * dynSoname = (Elf_Dyn *) (contents + rdi(shdrDynamic.sh_offset)); char * soname = 0; for ( ; rdi(dynSoname->d_tag) != DT_NULL; dynSoname++) { @@ -905,11 +912,21 @@ string ElfFile<ElfFileParamNames>::getSoname() template<ElfFileParams> void ElfFile<ElfFileParamNames>::setSoname(const string & newSoname) { - debug("setting new soname...\n"); + Elf_Shdr & shdrDynamic = findSection(".dynamic"); Elf_Shdr & shdrDynStr = findSection(".dynstr"); char * strTab = (char *) contents + rdi(shdrDynStr.sh_offset); - Elf_Shdr & shdrDynamic = findSection(".dynamic"); + /* Find the DT_STRTAB entry in the dynamic section. */ + Elf_Dyn * dyn = (Elf_Dyn *) (contents + rdi(shdrDynamic.sh_offset)); + Elf_Addr strTabAddr = 0; + for ( ; rdi(dyn->d_tag) != DT_NULL; dyn++) + if (rdi(dyn->d_tag) == DT_STRTAB) strTabAddr = rdi(dyn->d_un.d_ptr); + if (!strTabAddr) error("strange: no string table"); + + /* We assume that the virtual address in the DT_STRTAB entry + of the dynamic section corresponds to the .dynstr section. */ + assert(strTabAddr == rdi(shdrDynStr.sh_addr)); + Elf_Dyn * dynSoname = (Elf_Dyn *) (contents + rdi(shdrDynamic.sh_offset)); char * soname = 0; for ( ; rdi(dynSoname->d_tag) != DT_NULL; dynSoname++) { |