From 211ee2c00aeb4b0bc6ab33ad0ed34525d895069d Mon Sep 17 00:00:00 2001 From: Chingis Dugarzhapov Date: Thu, 10 Apr 2014 18:52:50 +0200 Subject: Added assertion in TODO, removed some useless debug msgs... --- src/patchelf.cc | 29 +++++++++++++++++++++++------ 1 file 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::getInterpreter() template string ElfFile::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::getSoname() template void ElfFile::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++) { -- cgit v0.12