diff options
author | George Rimar <grimar@accesssoftek.com> | 2019-08-29 10:58:47 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2019-08-29 10:58:47 +0000 |
commit | de0bc44883bc94ebaae85bf95d52a5e9bf7aa4ea (patch) | |
tree | 29fbfa4377263482ec26f66afe45c3f66902e80f /llvm/lib/ObjectYAML/ELFEmitter.cpp | |
parent | 72e9584698e83445c0e1ab84431675290f3d3595 (diff) | |
download | bcm5719-llvm-de0bc44883bc94ebaae85bf95d52a5e9bf7aa4ea.tar.gz bcm5719-llvm-de0bc44883bc94ebaae85bf95d52a5e9bf7aa4ea.zip |
[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
llvm-svn: 370331
Diffstat (limited to 'llvm/lib/ObjectYAML/ELFEmitter.cpp')
-rw-r--r-- | llvm/lib/ObjectYAML/ELFEmitter.cpp | 24 |
1 files changed, 6 insertions, 18 deletions
diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp index 96b13e4e530..76dd4b4e4e7 100644 --- a/llvm/lib/ObjectYAML/ELFEmitter.cpp +++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp @@ -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; } |