Loader: Handle bad section names when loading an ELF file.
authorGabe Black <gblack@eecs.umich.edu>
Mon, 13 Jun 2011 06:52:21 +0000 (23:52 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Mon, 13 Jun 2011 06:52:21 +0000 (23:52 -0700)
If there's a problem when reading the section names from a supposed ELF file,
this change makes gem5 print an error message as returned by libelf and die.
Previously these sorts of errors would make gem5 segfault when it tried to
access the section name through a NULL pointer.

src/base/loader/elf_object.cc

index 6fcbd0ae3e506a527fefc9808a71df6457af210e..1b1841a45d37c0688cfe20de008d7f315e3e6c9f 100644 (file)
@@ -266,12 +266,20 @@ ElfObject::ElfObject(const string &_filename, int _fd,
         gelf_getshdr(section, &shdr);
         char * secName = elf_strptr(elf, ehdr.e_shstrndx, shdr.sh_name);
 
-        if (!strcmp(".text", secName)) {
-            textSecStart = shdr.sh_addr;
-        } else if (!strcmp(".data", secName)) {
-            dataSecStart = shdr.sh_addr;
-        } else if (!strcmp(".bss", secName)) {
-            bssSecStart = shdr.sh_addr;
+        if (secName) {
+            if (!strcmp(".text", secName)) {
+                textSecStart = shdr.sh_addr;
+            } else if (!strcmp(".data", secName)) {
+                dataSecStart = shdr.sh_addr;
+            } else if (!strcmp(".bss", secName)) {
+                bssSecStart = shdr.sh_addr;
+            }
+        } else {
+            Elf_Error errorNum = (Elf_Error)elf_errno();
+            if (errorNum != ELF_E_NONE) {
+                const char *errorMessage = elf_errmsg(errorNum);
+                fatal("Error from libelf: %s.\n", errorMessage);
+            }
         }
 
         section = elf_getscn(elf, ++secIdx);