[llvm] r356739 - [llvm-objcopy] - Fix a st_name of the first symbol table entry.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 22 03:28:56 PDT 2019


Author: grimar
Date: Fri Mar 22 03:28:56 2019
New Revision: 356739

URL: http://llvm.org/viewvc/llvm-project?rev=356739&view=rev
Log:
[llvm-objcopy] - Fix a st_name of the first symbol table entry.

Spec says about the first symbol table entry that index 0 both designates the first entry in the table
and serves as the undefined symbol index. It should have zero value.
Hence the first symbol table entry has no name. And so has to have a st_name == 0.
(http://refspecs.linuxbase.org/elf/gabi4+/ch4.symtab.html)

Currently, we do not emit zero value for the first symbol table entry.
That happens because we add empty strings to the string builder, which
for each such case adds a zero byte:
(https://github.com/llvm-mirror/llvm/blob/master/lib/MC/StringTableBuilder.cpp#L185)
After the string optimization performed it might return non zero indexes for the
empty string requested.

The patch fixes this issue for the case above and other sections with no names.

Differential revision: https://reviews.llvm.org/D59496

Added:
    llvm/trunk/test/tools/llvm-objcopy/ELF/symbol-empty-name.test
Modified:
    llvm/trunk/lib/MC/StringTableBuilder.cpp

Modified: llvm/trunk/lib/MC/StringTableBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/StringTableBuilder.cpp?rev=356739&r1=356738&r2=356739&view=diff
==============================================================================
--- llvm/trunk/lib/MC/StringTableBuilder.cpp (original)
+++ llvm/trunk/lib/MC/StringTableBuilder.cpp Fri Mar 22 03:28:56 2019
@@ -159,6 +159,13 @@ void StringTableBuilder::finalizeStringT
 
   if (K == MachO)
     Size = alignTo(Size, 4); // Pad to multiple of 4.
+
+  // The first byte in an ELF string table must be null, according to the ELF
+  // specification. In 'initSize()' we reserved the first byte to hold null for
+  // this purpose and here we actually add the string to allow 'getOffset()' to
+  // be called on an empty string.
+  if (K == ELF)
+    StringIndexMap[CachedHashStringRef("")] = 0;
 }
 
 void StringTableBuilder::clear() {

Added: llvm/trunk/test/tools/llvm-objcopy/ELF/symbol-empty-name.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/symbol-empty-name.test?rev=356739&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/symbol-empty-name.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/symbol-empty-name.test Fri Mar 22 03:28:56 2019
@@ -0,0 +1,47 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy %t %t2
+# RUN: llvm-readobj -t %t2 | FileCheck %s
+
+## Check that all values of the null symbol are zeroes.
+
+# CHECK:      Symbols [
+# CHECK-NEXT:  Symbol {
+# CHECK-NEXT:    Name:  (0)
+# CHECK-NEXT:    Value: 0x0
+# CHECK-NEXT:    Size: 0
+# CHECK-NEXT:    Binding: Local (0x0)
+# CHECK-NEXT:    Type: None (0x0)
+# CHECK-NEXT:    Other: 0
+# CHECK-NEXT:    Section: Undefined (0x0)
+# CHECK-NEXT:  }
+
+## Check we emit a zero in st_name field when a symbol has no name.
+
+# CHECK:       Name: .text (0)
+# CHECK-NEXT:   Value: 0x0
+# CHECK-NEXT:   Size: 0
+# CHECK-NEXT:   Binding: Local (0x0)
+# CHECK-NEXT:   Type: Section (0x3)
+# CHECK-NEXT:   Other: 0
+# CHECK-NEXT:   Section: .text (0x1)
+# CHECK-NEXT: }
+
+!ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_X86_64
+Sections:
+  - Name:  .text
+    Type:  SHT_PROGBITS
+    Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+Symbols:
+  Local:
+    - Name:    ""
+      Type:    STT_SECTION
+      Section: .text
+  Global:
+  # We need to have a named symbol, otherwise the original
+  # issue that was fixed is not reproduced by this test.
+    - Name: foo




More information about the llvm-commits mailing list