diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp index 96b13e4e5303..76dd4b4e4e77 100644 --- a/llvm/lib/ObjectYAML/ELFEmitter.cpp +++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp @@ -995,24 +995,12 @@ template bool ELFState::buildSectionIndex() { } static bool buildSymbolsMap(ArrayRef 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; } diff --git a/llvm/test/tools/yaml2obj/elf-symbols-binding-order.yaml b/llvm/test/tools/yaml2obj/elf-symbols-binding-order.yaml index 1c9fbe30e4e2..0c79f0e716ed 100644 --- a/llvm/test/tools/yaml2obj/elf-symbols-binding-order.yaml +++ b/llvm/test/tools/yaml2obj/elf-symbols-binding-order.yaml @@ -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: bar + - Name: staticLocal + Binding: STB_LOCAL +DynamicSymbols: + - Name: dynamicGlobal + Binding: STB_GLOBAL + - Name: dynamicLocal Binding: STB_LOCAL