Skip to content

Commit

Permalink
[yaml2obj] - Allow placing local symbols after globals.
Browse files Browse the repository at this point in the history
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

llvm-svn: 370331
  • Loading branch information
George Rimar committed Aug 29, 2019
1 parent 72e9584 commit de0bc44
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 29 deletions.
24 changes: 6 additions & 18 deletions llvm/lib/ObjectYAML/ELFEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
38 changes: 27 additions & 11 deletions llvm/test/tools/yaml2obj/elf-symbols-binding-order.yaml
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit de0bc44

Please sign in to comment.