summaryrefslogtreecommitdiff
path: root/src/base/loader/elf_object.cc
diff options
context:
space:
mode:
authorAli Saidi <saidi@eecs.umich.edu>2007-09-11 00:01:24 -0400
committerAli Saidi <saidi@eecs.umich.edu>2007-09-11 00:01:24 -0400
commit19fbdcd30bfcbfe11b2a1a315039f0e3b68025a1 (patch)
tree851314640efc3d6864bcd5d9ad40c1d270a3514d /src/base/loader/elf_object.cc
parent0f57b407a3df68f93e73e0635569d7bf5dd151b0 (diff)
downloadgem5-19fbdcd30bfcbfe11b2a1a315039f0e3b68025a1.tar.xz
Loader: Error if a TLS section is found in the binary.
--HG-- extra : convert_revision : d763c0382f3cbcc9786510f5a8e521ec9d55eff1
Diffstat (limited to 'src/base/loader/elf_object.cc')
-rw-r--r--src/base/loader/elf_object.cc18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/base/loader/elf_object.cc b/src/base/loader/elf_object.cc
index f76ea593b..ecce175b2 100644
--- a/src/base/loader/elf_object.cc
+++ b/src/base/loader/elf_object.cc
@@ -343,8 +343,8 @@ ElfObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask)
return loadSomeSymbols(symtab, STB_LOCAL);
}
-bool
-ElfObject::isDynamic()
+void
+ElfObject::getSections()
{
Elf *elf;
int sec_idx = 1; // there is a 0 but it is nothing, go figure
@@ -353,6 +353,8 @@ ElfObject::isDynamic()
GElf_Ehdr ehdr;
+ assert(!sectionNames.size());
+
// check that header matches library version
if (elf_version(EV_CURRENT) == EV_NONE)
panic("wrong elf version number!");
@@ -372,11 +374,17 @@ ElfObject::isDynamic()
// While there are no more sections
while (section != NULL) {
gelf_getshdr(section, &shdr);
- if (!strcmp(".interp", elf_strptr(elf, ehdr.e_shstrndx, shdr.sh_name)))
- return true;
+ sectionNames.insert(elf_strptr(elf, ehdr.e_shstrndx, shdr.sh_name));
section = elf_getscn(elf, ++sec_idx);
} // while sections
- return false;
+}
+
+bool
+ElfObject::sectionExists(string sec)
+{
+ if (!sectionNames.size())
+ getSections();
+ return sectionNames.find(sec) != sectionNames.end();
}