summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2019-04-18 11:02:07 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2019-04-18 11:02:07 +0000
commita630b340573fe141414a3b82c7bdf0b5c4a8ccf7 (patch)
tree1e35b5d4ca8662d4a271e68d707395aa2b354d33
parent99b7277d390cbacf3304eb0f00d137582c520f4e (diff)
downloadbcm5719-llvm-a630b340573fe141414a3b82c7bdf0b5c4a8ccf7.tar.gz
bcm5719-llvm-a630b340573fe141414a3b82c7bdf0b5c4a8ccf7.zip
[yaml2elf/obj2yaml] - Allow normal parsing/dumping of the .rela.dyn section
.rela.dyn is a section that has sh_info normally set to zero. And Info is an optional field in the description of the relocation section in YAML. But currently, yaml2obj would fail to produce the object when Info is not explicitly listed. The patch fixes the issue. Differential revision: https://reviews.llvm.org/D60820 llvm-svn: 358656
-rw-r--r--llvm/test/tools/obj2yaml/elf-reladyn-section-shinfo.yaml44
-rw-r--r--llvm/tools/yaml2obj/yaml2elf.cpp5
2 files changed, 47 insertions, 2 deletions
diff --git a/llvm/test/tools/obj2yaml/elf-reladyn-section-shinfo.yaml b/llvm/test/tools/obj2yaml/elf-reladyn-section-shinfo.yaml
new file mode 100644
index 00000000000..0f2906470f3
--- /dev/null
+++ b/llvm/test/tools/obj2yaml/elf-reladyn-section-shinfo.yaml
@@ -0,0 +1,44 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readobj --sections %t | FileCheck %s
+# RUN: obj2yaml %t | FileCheck %s --check-prefix=YAML
+
+## .rela.dyn is a dynamic relocation section that normally has
+## no value in sh_info field. Check we are able to use
+## yaml2obj/obj2yaml without needing to explicitly set it.
+
+# CHECK: Name: .rela.dyn
+# CHECK-NEXT: Type: SHT_RELA
+# CHECK-NEXT: Flags [
+# CHECK-NEXT: SHF_ALLOC
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address:
+# CHECK-NEXT: Offset:
+# CHECK-NEXT: Size:
+# CHECK-NEXT: Link:
+# CHECK-NEXT: Info: 0
+# CHECK-NEXT: AddressAlignment:
+# CHECK-NEXT: EntrySize:
+
+# YAML: - Name: .rela.dyn
+# YAML-NEXT: Type: SHT_RELA
+# YAML-NEXT: Flags: [ SHF_ALLOC ]
+# YAML-NEXT: Link: .dynsym
+# YAML-NEXT: EntSize: 0x0000000000000018
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+ Entry: 0x0000000000001000
+Sections:
+ - Name: .rela.dyn
+ Type: SHT_RELA
+ Flags: [ SHF_ALLOC ]
+ Link: .dynsym
+ EntSize: 0x0000000000000018
+# Add at least one symbol to trigger the .dynsym emission.
+DynamicSymbols:
+ - Name: bar
+ Binding: STB_GLOBAL
diff --git a/llvm/tools/yaml2obj/yaml2elf.cpp b/llvm/tools/yaml2obj/yaml2elf.cpp
index 1507504239b..a30093a042f 100644
--- a/llvm/tools/yaml2obj/yaml2elf.cpp
+++ b/llvm/tools/yaml2obj/yaml2elf.cpp
@@ -278,8 +278,9 @@ bool ELFState<ELFT>::initSectionHeaders(std::vector<Elf_Shdr> &SHeaders,
// For relocation section set link to .symtab by default.
SHeader.sh_link = getDotSymTabSecNo();
- unsigned Index;
- if (!convertSectionIndex(SN2I, S->Name, S->RelocatableSec, Index))
+ unsigned Index = 0;
+ if (!S->RelocatableSec.empty() &&
+ !convertSectionIndex(SN2I, S->Name, S->RelocatableSec, Index))
return false;
SHeader.sh_info = Index;
if (!writeSectionContent(SHeader, *S, CBA))
OpenPOWER on IntegriCloud