From 4db0416016785a72bb9b085db7957109546dbcfa Mon Sep 17 00:00:00 2001 From: George Rimar Date: Thu, 29 Aug 2019 10:58:47 +0000 Subject: [PATCH] [yaml2obj] - Allow placing local symbols after globals. 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 | 24 +++--------- .../yaml2obj/elf-symbols-binding-order.yaml | 38 +++++++++++++------ 2 files changed, 33 insertions(+), 29 deletions(-) diff --git a/lib/ObjectYAML/ELFEmitter.cpp b/lib/ObjectYAML/ELFEmitter.cpp index 96b13e4e530..76dd4b4e4e7 100644 --- a/lib/ObjectYAML/ELFEmitter.cpp +++ b/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/test/tools/yaml2obj/elf-symbols-binding-order.yaml b/test/tools/yaml2obj/elf-symbols-binding-order.yaml index 1c9fbe30e4e..0c79f0e716e 100644 --- a/test/tools/yaml2obj/elf-symbols-binding-order.yaml +++ b/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: staticLocal + Binding: STB_LOCAL +DynamicSymbols: + - Name: dynamicGlobal Binding: STB_GLOBAL - - Name: bar + - Name: dynamicLocal Binding: STB_LOCAL -- 2.40.0