]> granicus.if.org Git - llvm/commitdiff
[yaml2obj] - Allow placing local symbols after globals.
authorGeorge Rimar <grimar@accesssoftek.com>
Thu, 29 Aug 2019 10:58:47 +0000 (10:58 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Thu, 29 Aug 2019 10:58:47 +0000 (10:58 +0000)
This allows us to produce broken binaries with local
symbols placed after global in '.dynsym'/'.symtab'

Also, simplifies the code.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@370331 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ObjectYAML/ELFEmitter.cpp
test/tools/yaml2obj/elf-symbols-binding-order.yaml

index 96b13e4e530312c5145c2b8d6769453aef12dabe..76dd4b4e4e7717e33f9dfd41b1d9c69abf82ae21 100644 (file)
@@ -995,24 +995,12 @@ template <class ELFT> bool ELFState<ELFT>::buildSectionIndex() {
 }
 
 static bool buildSymbolsMap(ArrayRef<ELFYAML::Symbol> V, NameToIdxMap &Map) {
-  bool GlobalSymbolSeen = false;
-  std::size_t I = 0;
-  for (const ELFYAML::Symbol &Sym : V) {
-    ++I;
-
-    StringRef Name = Sym.Name;
-    if (Sym.Binding.value == ELF::STB_LOCAL && GlobalSymbolSeen) {
-      WithColor::error() << "Local symbol '" + Name +
-                                "' after global in Symbols list.\n";
-      return false;
-    }
-    if (Sym.Binding.value != ELF::STB_LOCAL)
-      GlobalSymbolSeen = true;
-
-    if (!Name.empty() && !Map.addName(Name, I)) {
-      WithColor::error() << "Repeated symbol name: '" << Name << "'.\n";
-      return false;
-    }
+  for (size_t I = 0, S = V.size(); I < S; ++I) {
+    const ELFYAML::Symbol &Sym = V[I];
+    if (Sym.Name.empty() || Map.addName(Sym.Name, I + 1))
+      continue;
+    WithColor::error() << "Repeated symbol name: '" << Sym.Name << "'.\n";
+    return false;
   }
   return true;
 }
index 1c9fbe30e4e2040364f958117cc32e490546fcd9..0c79f0e716edb82839712157558445c86d128652 100644 (file)
@@ -1,18 +1,34 @@
-## Check we restrict placing local symbols after global in .symtab
-## We might want to change it later to allow doing that
-## for producing broken outputs.
+## Check we allow placing local symbols after global to
+## .symtab and .dynsym. This allows us to produce broken outputs.
 
-# RUN: not yaml2obj %s -o %t 2>&1 | FileCheck %s
-# CHECK: error: Local symbol 'bar' after global in Symbols list.
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readelf --symbols %t | FileCheck %s
+
+# CHECK:      Symbol table '.dynsym' contains 3 entries:
+# CHECK-NEXT:    Num:    Value          Size Type    Bind   Vis      Ndx Name
+# CHECK-NEXT:      0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
+# CHECK-NEXT:      1: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND dynamicGlobal
+# CHECK-NEXT:      2: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND dynamicLocal
+
+# CHECK:      Symbol table '.symtab' contains 3 entries:
+# CHECK-NEXT:    Num:    Value          Size Type    Bind   Vis      Ndx Name
+# CHECK-NEXT:      0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
+# CHECK-NEXT:      1: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND staticGlobal
+# CHECK-NEXT:      2: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND staticLocal
 
 --- !ELF
 FileHeader:
-  Class:           ELFCLASS64
-  Data:            ELFDATA2LSB
-  Type:            ET_REL
-  Machine:         EM_X86_64
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
 Symbols:
-  - Name:    foo
+  - Name:    staticGlobal
+    Binding: STB_GLOBAL
+  - Name:    staticLocal
+    Binding: STB_LOCAL
+DynamicSymbols:
+  - Name:    dynamicGlobal
     Binding: STB_GLOBAL
-  - Name:    bar
+  - Name:    dynamicLocal
     Binding: STB_LOCAL