summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-01-14 11:05:44 (GMT)
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-01-14 11:05:44 (GMT)
commitbf03aff2ea0951bd9f74fe0a304b4d32141ee42e (patch)
tree36ac0b412b54806b85f2ceefe2d91f65fbcc87c2
parente6b9f431e4d5c7122112812d905bb2f921afa939 (diff)
downloadpatchelf-bf03aff2ea0951bd9f74fe0a304b4d32141ee42e.zip
patchelf-bf03aff2ea0951bd9f74fe0a304b4d32141ee42e.tar.gz
patchelf-bf03aff2ea0951bd9f74fe0a304b4d32141ee42e.tar.bz2
Handle invalid symbol table entries that refer to non-existent sections
For instance, libcairo-swt.so from Eclipse SDK 4.2.2 has entries like: 30: 0000000000000000 0 SECTION LOCAL DEFAULT 30 even though there is no section 30. So ignore these.
-rw-r--r--src/patchelf.cc11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/patchelf.cc b/src/patchelf.cc
index 1b7e510..a4591f1 100644
--- a/src/patchelf.cc
+++ b/src/patchelf.cc
@@ -835,11 +835,16 @@ void ElfFile<ElfFileParamNames>::rewriteHeaders(Elf_Addr phdrAddress)
debug("rewriting symbol table section %d\n", i);
for (size_t entry = 0; (entry + 1) * sizeof(Elf_Sym) <= rdi(shdrs[i].sh_size); entry++) {
Elf_Sym * sym = (Elf_Sym *) (contents + rdi(shdrs[i].sh_offset) + entry * sizeof(Elf_Sym));
- if (sym->st_shndx != SHN_UNDEF && sym->st_shndx < SHN_LORESERVE) {
- string section = sectionsByOldIndex[rdi(sym->st_shndx)];
+ unsigned int shndx = rdi(sym->st_shndx);
+ if (shndx != SHN_UNDEF && shndx < SHN_LORESERVE) {
+ if (shndx >= sectionsByOldIndex.size()) {
+ fprintf(stderr, "warning: entry %d in symbol table refers to a non-existent section, skipping\n", shndx);
+ continue;
+ }
+ string section = sectionsByOldIndex.at(shndx);
assert(!section.empty());
unsigned int newIndex = findSection3(section); // inefficient
- //debug("rewriting symbol %d: index = %d (%s) -> %d\n", entry, rdi(sym->st_shndx), section.c_str(), newIndex);
+ //debug("rewriting symbol %d: index = %d (%s) -> %d\n", entry, shndx, section.c_str(), newIndex);
wri(sym->st_shndx, newIndex);
}
}