Index: test/tools/yaml2obj/dynamic-relocations.yaml =================================================================== --- test/tools/yaml2obj/dynamic-relocations.yaml +++ test/tools/yaml2obj/dynamic-relocations.yaml @@ -0,0 +1,64 @@ +# 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 0000000100000000 R_X86_64_NONE 0000000011223344 static +# CHECK-NEXT: 0000000000000018 0000000200000000 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 + Size: 32 + - 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 +DynamicSymbols: + Global: + - Name: dynamic + Section: .data + Value: 0x12345678 + - Name: both + Section: .data + Value: 0x87654321 +Symbols: + Global: + - Name: static + Section: .data + Value: 0x11223344 + - Name: both + Section: .data + Value: 0x88776655 Index: tools/yaml2obj/yaml2elf.cpp =================================================================== --- tools/yaml2obj/yaml2elf.cpp +++ tools/yaml2obj/yaml2elf.cpp @@ -130,10 +130,12 @@ NameToIdxMap SN2I; NameToIdxMap SymN2I; + NameToIdxMap DynSymN2I; const ELFYAML::Object &Doc; bool buildSectionIndex(); bool buildSymbolIndex(std::size_t &StartIndex, + NameToIdxMap &IndexMap, const std::vector &Symbols); void initELFHeader(Elf_Ehdr &Header); void initProgramHeaders(std::vector &PHeaders); @@ -529,6 +531,8 @@ SHeader.sh_size = SHeader.sh_entsize * Section.Relocations.size(); auto &OS = CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign); + const NameToIdxMap &SymIndexMap = + Section.Link == ".dynsym" ? DynSymN2I : SymN2I; for (const auto &Rel : Section.Relocations) { unsigned SymIdx = 0; @@ -536,7 +540,7 @@ // an external reference. So it ignores the return value of lookup() // here. if (Rel.Symbol) - SymN2I.lookup(*Rel.Symbol, SymIdx); + SymIndexMap.lookup(*Rel.Symbol, SymIdx); if (IsRela) { Elf_Rela REntry; @@ -782,12 +786,13 @@ template bool ELFState::buildSymbolIndex(std::size_t &StartIndex, + NameToIdxMap &IndexMap, const std::vector &Symbols) { for (const auto &Sym : Symbols) { ++StartIndex; if (Sym.Name.empty()) continue; - if (SymN2I.addName(Sym.Name, StartIndex)) { + if (IndexMap.addName(Sym.Name, StartIndex)) { WithColor::error() << "Repeated symbol name: '" << Sym.Name << "'.\n"; return false; } @@ -848,9 +853,18 @@ return 1; std::size_t StartSymIndex = 0; - if (!State.buildSymbolIndex(StartSymIndex, Doc.Symbols.Local) || - !State.buildSymbolIndex(StartSymIndex, Doc.Symbols.Global) || - !State.buildSymbolIndex(StartSymIndex, Doc.Symbols.Weak)) + if (!State.buildSymbolIndex(StartSymIndex, State.SymN2I, Doc.Symbols.Local) || + !State.buildSymbolIndex(StartSymIndex, State.SymN2I, + Doc.Symbols.Global) || + !State.buildSymbolIndex(StartSymIndex, State.SymN2I, Doc.Symbols.Weak)) + return 1; + StartSymIndex = 0; + if (!State.buildSymbolIndex(StartSymIndex, State.DynSymN2I, + Doc.DynamicSymbols.Local) || + !State.buildSymbolIndex(StartSymIndex, State.DynSymN2I, + Doc.DynamicSymbols.Global) || + !State.buildSymbolIndex(StartSymIndex, State.DynSymN2I, + Doc.DynamicSymbols.Weak)) return 1; Elf_Ehdr Header;