[llvm] r184161 - [yaml2obj][ELF] Refer specifically to the section header string table.

Sean Silva silvas at purdue.edu
Mon Jun 17 18:11:24 PDT 2013


Author: silvas
Date: Mon Jun 17 20:11:24 2013
New Revision: 184161

URL: http://llvm.org/viewvc/llvm-project?rev=184161&view=rev
Log:
[yaml2obj][ELF] Refer specifically to the section header string table.

A bug in libObject will cause it to assert() if a symbol table's string
table and the section header string table are the same section, so we
need to ensure that we emit two different string tables (among other
things). The problematic code is the hardcoded usage of ".strtab"
(`dot_strtab_sec`) for looking up symbol names in
ELFObjectFile<ELFT>::getSymbolName.

I discussed this with Michael, and he has some local improvements to the
ELF code in libObject that, among other things, should fix our handling
of this scenario.

Modified:
    llvm/trunk/tools/yaml2obj/yaml2elf.cpp

Modified: llvm/trunk/tools/yaml2obj/yaml2elf.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2elf.cpp?rev=184161&r1=184160&r2=184161&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2elf.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2elf.cpp Mon Jun 17 20:11:24 2013
@@ -181,7 +181,7 @@ static int writeELF(raw_ostream &OS, con
     }
   }
 
-  StringTableBuilder StrTab;
+  StringTableBuilder SHStrTab;
   SmallVector<char, 128> Buf;
   // XXX: This offset is tightly coupled with the order that we write
   // things to `OS`.
@@ -193,7 +193,7 @@ static int writeELF(raw_ostream &OS, con
     const ELFYAML::Section &Sec = Sections[i];
     Elf_Shdr SHeader;
     zero(SHeader);
-    SHeader.sh_name = StrTab.addString(Sec.Name);
+    SHeader.sh_name = SHStrTab.addString(Sec.Name);
     SHeader.sh_type = Sec.Type;
     SHeader.sh_flags = Sec.Flags;
     SHeader.sh_addr = Sec.Address;
@@ -217,24 +217,24 @@ static int writeELF(raw_ostream &OS, con
     SHeaders.push_back(SHeader);
   }
 
-  // String table header.
-  Elf_Shdr StrTabSHeader;
-  zero(StrTabSHeader);
-  StrTabSHeader.sh_name = 0;
-  StrTabSHeader.sh_type = SHT_STRTAB;
-  StrTabSHeader.sh_flags = 0;
-  StrTabSHeader.sh_addr = 0;
-  StrTabSHeader.sh_offset = CBA.currentOffset();
-  StrTabSHeader.sh_size = StrTab.size();
-  StrTab.writeToStream(CBA.getOS());
-  StrTabSHeader.sh_link = 0;
-  StrTabSHeader.sh_info = 0;
-  StrTabSHeader.sh_addralign = 1;
-  StrTabSHeader.sh_entsize = 0;
+  // Section header string table header.
+  Elf_Shdr SHStrTabSHeader;
+  zero(SHStrTabSHeader);
+  SHStrTabSHeader.sh_name = 0;
+  SHStrTabSHeader.sh_type = SHT_STRTAB;
+  SHStrTabSHeader.sh_flags = 0;
+  SHStrTabSHeader.sh_addr = 0;
+  SHStrTabSHeader.sh_offset = CBA.currentOffset();
+  SHStrTabSHeader.sh_size = SHStrTab.size();
+  SHStrTab.writeToStream(CBA.getOS());
+  SHStrTabSHeader.sh_link = 0;
+  SHStrTabSHeader.sh_info = 0;
+  SHStrTabSHeader.sh_addralign = 1;
+  SHStrTabSHeader.sh_entsize = 0;
 
   OS.write((const char *)&Header, sizeof(Header));
   writeVectorData(OS, SHeaders);
-  OS.write((const char *)&StrTabSHeader, sizeof(StrTabSHeader));
+  OS.write((const char *)&SHStrTabSHeader, sizeof(SHStrTabSHeader));
   CBA.writeBlobToStream(OS);
   return 0;
 }





More information about the llvm-commits mailing list