Loader: Error if a TLS section is found in the binary.
authorAli Saidi <saidi@eecs.umich.edu>
Tue, 11 Sep 2007 04:01:24 +0000 (00:01 -0400)
committerAli Saidi <saidi@eecs.umich.edu>
Tue, 11 Sep 2007 04:01:24 +0000 (00:01 -0400)
--HG--
extra : convert_revision : d763c0382f3cbcc9786510f5a8e521ec9d55eff1

src/base/loader/elf_object.cc
src/base/loader/elf_object.hh
src/base/loader/object_file.cc
src/base/loader/object_file.hh
src/sim/process.cc

index f76ea593b72c1dcd1b72a323d20bb505aa24fdb7..ecce175b2d17faae6da1cc8b322abe918b7aafc4 100644 (file)
@@ -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();
 }
 
 
index d909140f3bf805793bc2bd8c14a5e6de8f493304..3e7c85874a681e0b2fb8140fbb72ec6d97107b65 100644 (file)
@@ -32,6 +32,7 @@
 #define __ELF_OBJECT_HH__
 
 #include "base/loader/object_file.hh"
+#include <set>
 
 class ElfObject : public ObjectFile
 {
@@ -42,6 +43,7 @@ class ElfObject : public ObjectFile
     Addr _programHeaderTable;
     uint16_t _programHeaderSize;
     uint16_t _programHeaderCount;
+    std::set<std::string> sectionNames;
 
     /// Helper functions for loadGlobalSymbols() and loadLocalSymbols().
     bool loadSomeSymbols(SymbolTable *symtab, int binding);
@@ -50,6 +52,9 @@ class ElfObject : public ObjectFile
               size_t _len, uint8_t *_data,
               Arch _arch, OpSys _opSys);
 
+    void getSections();
+    bool sectionExists(std::string sec);
+
   public:
     virtual ~ElfObject() {}
 
@@ -58,7 +63,8 @@ class ElfObject : public ObjectFile
     virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
             std::numeric_limits<Addr>::max());
 
-    virtual bool isDynamic();
+    virtual bool isDynamic() { return sectionExists(".interp"); }
+    virtual bool hasTLS() { return sectionExists(".tbss"); }
 
     static ObjectFile *tryFile(const std::string &fname, int fd,
                                size_t len, uint8_t *data);
index 7424b9305d19aa2b6ebe92658f45c41ef7ebe2e0..2273b6c4e9d1586c8222ef7feda91562cb7358dd 100644 (file)
@@ -150,9 +150,3 @@ createObjectFile(const string &fname, bool raw)
     munmap((char*)fileData, len);
     return NULL;
 }
-
-bool
-ObjectFile::isDynamic()
-{
-    return false;
-}
index 4b44a6e22f31fb942d9faa555474dda975ffa943..4f0c17cc8f9dd1a1aa559a61cf2f57bd9fe4c630 100644 (file)
@@ -85,7 +85,8 @@ class ObjectFile
     virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
             std::numeric_limits<Addr>::max()) = 0;
 
-    virtual bool  isDynamic();
+    virtual bool isDynamic() { return false; }
+    virtual bool hasTLS() { return false; }
 
     Arch  getArch()  const { return arch; }
     OpSys getOpSys() const { return opSys; }
index 4fa5c7aada0d71159d6cb5f1d8ce79cde08375aa..f943cb5655b60f793a411db5b0538430fed04728 100644 (file)
@@ -453,9 +453,15 @@ LiveProcess::create(const std::string &nm, System *system, int stdin_fd,
 
     if (objFile->isDynamic())
        fatal("Object file is a dynamic executable however only static "
-             "executables are supported!\n        Please recompile your "
+             "executables are supported!\n       Please recompile your "
              "executable as a static binary and try again.\n");
 
+    if (objFile->hasTLS())
+        fatal("Object file has a TLS section and loading of TLS sections "
+              "are not currently supported!\n       Please recompile your "
+              "executable with a non-TLS toolchain or add TLS support to "
+              "M5 and try again\n");
+
 #if THE_ISA == ALPHA_ISA
     if (objFile->getArch() != ObjectFile::Alpha)
         fatal("Object file architecture does not match compiled ISA (Alpha).");