diff options
-rw-r--r-- | include/llvm/ObjectYAML/ELFYAML.h | 2 | ||||
-rw-r--r-- | lib/ObjectYAML/ELFYAML.cpp | 2 | ||||
-rw-r--r-- | test/tools/yaml2obj/invalid-symboless-relocation.yaml | 29 | ||||
-rw-r--r-- | test/tools/yaml2obj/symboless-relocation.yaml | 21 | ||||
-rw-r--r-- | tools/yaml2obj/yaml2elf.cpp | 3 |
5 files changed, 54 insertions, 3 deletions
diff --git a/include/llvm/ObjectYAML/ELFYAML.h b/include/llvm/ObjectYAML/ELFYAML.h index c4a1fe2ce39..317e982c26f 100644 --- a/include/llvm/ObjectYAML/ELFYAML.h +++ b/include/llvm/ObjectYAML/ELFYAML.h @@ -161,7 +161,7 @@ struct Relocation { llvm::yaml::Hex64 Offset; int64_t Addend; ELF_REL Type; - StringRef Symbol; + Optional<StringRef> Symbol; }; struct RelocationSection : Section { diff --git a/lib/ObjectYAML/ELFYAML.cpp b/lib/ObjectYAML/ELFYAML.cpp index fd0aa49445f..cf0a943a880 100644 --- a/lib/ObjectYAML/ELFYAML.cpp +++ b/lib/ObjectYAML/ELFYAML.cpp @@ -853,7 +853,7 @@ void MappingTraits<ELFYAML::Relocation>::mapping(IO &IO, assert(Object && "The IO context is not initialized"); IO.mapRequired("Offset", Rel.Offset); - IO.mapRequired("Symbol", Rel.Symbol); + IO.mapOptional("Symbol", Rel.Symbol); if (Object->Header.Machine == ELFYAML::ELF_EM(ELF::EM_MIPS) && Object->Header.Class == ELFYAML::ELF_ELFCLASS(ELF::ELFCLASS64)) { diff --git a/test/tools/yaml2obj/invalid-symboless-relocation.yaml b/test/tools/yaml2obj/invalid-symboless-relocation.yaml new file mode 100644 index 00000000000..538f64c9ccc --- /dev/null +++ b/test/tools/yaml2obj/invalid-symboless-relocation.yaml @@ -0,0 +1,29 @@ +# This test succeeds but produces an invalid relocation. This test +# documents this behavoir. +# RUN: yaml2obj %s > %t +# RUN: llvm-readobj -relocations %t | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Content: "00000000" + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + Relocations: + - Offset: 0x1000 + Type: R_X86_64_PC32 + +#CHECK: Relocations [ +#CHECK-NEXT: Section (2) .rel.text { +#CHECK-NEXT: 0x1000 R_X86_64_PC32 - 0x0 +#CHECK-NEXT: } +#CHECK-NEXT:] diff --git a/test/tools/yaml2obj/symboless-relocation.yaml b/test/tools/yaml2obj/symboless-relocation.yaml new file mode 100644 index 00000000000..99f7af61095 --- /dev/null +++ b/test/tools/yaml2obj/symboless-relocation.yaml @@ -0,0 +1,21 @@ +# Just make sure this isn't an error even though it has no Symbol +# RUN: yaml2obj %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Content: "00000000" + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + Relocations: + - Offset: 0x1000 + Type: R_X86_64_RELATIVE diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index 1d28a1abffc..e1f73f7f991 100644 --- a/tools/yaml2obj/yaml2elf.cpp +++ b/tools/yaml2obj/yaml2elf.cpp @@ -459,7 +459,8 @@ ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader, // Some special relocation, R_ARM_v4BX for instance, does not have // an external reference. So it ignores the return value of lookup() // here. - SymN2I.lookup(Rel.Symbol, SymIdx); + if (Rel.Symbol) + SymN2I.lookup(*Rel.Symbol, SymIdx); if (IsRela) { Elf_Rela REntry; |