]> granicus.if.org Git - llvm/commitdiff
[yaml2elf/obj2yaml] - Allow normal parsing/dumping of the .rela.dyn section
authorGeorge Rimar <grimar@accesssoftek.com>
Thu, 18 Apr 2019 11:02:07 +0000 (11:02 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Thu, 18 Apr 2019 11:02:07 +0000 (11:02 +0000)
.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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358656 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/obj2yaml/elf-reladyn-section-shinfo.yaml [new file with mode: 0644]
tools/yaml2obj/yaml2elf.cpp

diff --git a/test/tools/obj2yaml/elf-reladyn-section-shinfo.yaml b/test/tools/obj2yaml/elf-reladyn-section-shinfo.yaml
new file mode 100644 (file)
index 0000000..0f29064
--- /dev/null
@@ -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
index 1507504239b56fae17fbe35a320ecb193c53796b..a30093a042f012b7a2c94d562edd5cb763bfda9c 100644 (file)
@@ -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))