Index: llvm/trunk/lib/ObjectYAML/ELFEmitter.cpp =================================================================== --- llvm/trunk/lib/ObjectYAML/ELFEmitter.cpp +++ llvm/trunk/lib/ObjectYAML/ELFEmitter.cpp @@ -111,10 +111,11 @@ NameToIdxMap SN2I; NameToIdxMap SymN2I; + NameToIdxMap DynSymN2I; ELFYAML::Object &Doc; bool buildSectionIndex(); - bool buildSymbolIndex(ArrayRef Symbols); + bool buildSymbolIndexes(); void initELFHeader(Elf_Ehdr &Header); void initProgramHeaders(std::vector &PHeaders); bool initImplicitHeader(ELFState &State, ContiguousBlobAccumulator &CBA, @@ -717,11 +718,12 @@ auto &OS = CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign); + const NameToIdxMap &SymMap = Section.Link == ".dynsym" ? DynSymN2I : SymN2I; for (const auto &Rel : Section.Relocations) { unsigned SymIdx = 0; // If a relocation references a symbol, try to look one up in the symbol // table. If it is not there, treat the value as a symbol index. - if (Rel.Symbol && !SymN2I.lookup(*Rel.Symbol, SymIdx) && + if (Rel.Symbol && !SymMap.lookup(*Rel.Symbol, SymIdx) && !to_integer(*Rel.Symbol, SymIdx)) { WithColor::error() << "Unknown symbol referenced: '" << *Rel.Symbol << "' at YAML section '" << Section.Name << "'.\n"; @@ -987,11 +989,10 @@ return true; } -template -bool ELFState::buildSymbolIndex(ArrayRef Symbols) { +static bool buildSymbolsMap(ArrayRef V, NameToIdxMap &Map) { bool GlobalSymbolSeen = false; std::size_t I = 0; - for (const auto &Sym : Symbols) { + for (const ELFYAML::Symbol &Sym : V) { ++I; StringRef Name = Sym.Name; @@ -1003,7 +1004,7 @@ if (Sym.Binding.value != ELF::STB_LOCAL) GlobalSymbolSeen = true; - if (!Name.empty() && !SymN2I.addName(Name, I)) { + if (!Name.empty() && !Map.addName(Name, I)) { WithColor::error() << "Repeated symbol name: '" << Name << "'.\n"; return false; } @@ -1011,6 +1012,11 @@ return true; } +template bool ELFState::buildSymbolIndexes() { + return buildSymbolsMap(Doc.Symbols, SymN2I) && + buildSymbolsMap(Doc.DynamicSymbols, DynSymN2I); +} + template void ELFState::finalizeStrings() { // Add the regular symbol names to .strtab section. for (const ELFYAML::Symbol &Sym : Doc.Symbols) @@ -1049,10 +1055,7 @@ // sections that might want to use them. State.finalizeStrings(); - if (!State.buildSectionIndex()) - return 1; - - if (!State.buildSymbolIndex(Doc.Symbols)) + if (!State.buildSectionIndex() || !State.buildSymbolIndexes()) return 1; Elf_Ehdr Header; Index: llvm/trunk/test/tools/llvm-readobj/demangle.test =================================================================== --- llvm/trunk/test/tools/llvm-readobj/demangle.test +++ llvm/trunk/test/tools/llvm-readobj/demangle.test @@ -139,9 +139,7 @@ EntSize: 0x18 Relocations: - Offset: 0x10 - ## FIXME: This should be a lookup in the corresponding symbol table, not necessarily the static symbol table. - ## See https://bugs.llvm.org/show_bug.cgi?id=40337. - Symbol: _Z3fooc + Symbol: _Z3fooi Type: R_X86_64_PC32 Addend: 0x4 - Name: .dynamic Index: llvm/trunk/test/tools/yaml2obj/dynamic-relocations.yaml =================================================================== --- llvm/trunk/test/tools/yaml2obj/dynamic-relocations.yaml +++ llvm/trunk/test/tools/yaml2obj/dynamic-relocations.yaml @@ -0,0 +1,65 @@ +## Show that yaml2obj uses the correct set of symbols for relocation sections +## referencing the dynamic symbol table. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-readelf -r %t | FileCheck %s + +# CHECK: Relocation section '.rela.dyn' at offset {{.*}} contains 2 entries: +# CHECK-NEXT: Offset Info Type Symbol's Value Symbol's Name +# CHECK-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE 0000000012345678 dynamic +# CHECK-NEXT: 0000000000000008 0000000200000000 R_X86_64_NONE 0000000087654321 both +# CHECK-EMPTY: +# CHECK-NEXT: Relocation section '.rela.data' at offset {{.*}} contains 2 entries: +# CHECK-NEXT: Offset Info Type Symbol's Value Symbol's Name +# CHECK-NEXT: 0000000000000010 0000000200000000 R_X86_64_NONE 0000000011223344 static +# CHECK-NEXT: 0000000000000018 0000000100000000 R_X86_64_NONE 0000000088776655 both + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .data + Type: SHT_PROGBITS + - Name: .rela.dyn + Type: SHT_REL + Link: .dynsym + Info: .data + Relocations: + - Offset: 0 + Type: R_X86_64_NONE + Symbol: dynamic + - Offset: 8 + Type: R_X86_64_NONE + Symbol: both + - Name: .rela.data + Type: SHT_REL + Link: .symtab + Info: .data + Relocations: + - Offset: 16 + Type: R_X86_64_NONE + Symbol: static + - Offset: 24 + Type: R_X86_64_NONE + Symbol: both +Symbols: + - Name: both + Section: .data + Value: 0x88776655 + Binding: STB_GLOBAL + - Name: static + Section: .data + Value: 0x11223344 + Binding: STB_GLOBAL +DynamicSymbols: + - Name: dynamic + Section: .data + Value: 0x12345678 + Binding: STB_GLOBAL + - Name: both + Section: .data + Value: 0x87654321 + Binding: STB_GLOBAL Index: llvm/trunk/test/tools/yaml2obj/dynamic-symbols.yaml =================================================================== --- llvm/trunk/test/tools/yaml2obj/dynamic-symbols.yaml +++ llvm/trunk/test/tools/yaml2obj/dynamic-symbols.yaml @@ -14,6 +14,10 @@ Type: SHT_PROGBITS Flags: [ SHF_ALLOC, SHF_WRITE ] DynamicSymbols: + - Name: dynlocal + Type: STT_OBJECT + Section: .data + Binding: STB_LOCAL - Name: dynglobal Type: STT_OBJECT Section: .data @@ -22,10 +26,6 @@ Type: STT_OBJECT Section: .data Binding: STB_WEAK - - Name: dynlocal - Type: STT_OBJECT - Section: .data - Binding: STB_LOCAL # SECTION: Name: .dynsym # SECTION-NEXT: Type: SHT_DYNSYM @@ -36,6 +36,6 @@ # SECTION-NEXT: Flags # SECTION-NEXT: SHF_ALLOC +# SYMBOL-DAG: d dynlocal # SYMBOL-DAG: D dynglobal # SYMBOL-DAG: V dynweak -# SYMBOL-DAG: d dynlocal