[llvm] e26e9ba - [obj2yaml] - Stop dumping an empty sh_info field for SHT_RELA/SHT_REL sections.
Georgii Rymar via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 19 04:00:39 PDT 2020
Author: Georgii Rymar
Date: 2020-03-19T14:00:21+03:00
New Revision: e26e9ba288ce156b851504ebbb7d8a775572957c
URL: https://github.com/llvm/llvm-project/commit/e26e9ba288ce156b851504ebbb7d8a775572957c
DIFF: https://github.com/llvm/llvm-project/commit/e26e9ba288ce156b851504ebbb7d8a775572957c.diff
LOG: [obj2yaml] - Stop dumping an empty sh_info field for SHT_RELA/SHT_REL sections.
`.rela.dyn` is a dynamic relocation section that normally has
no value in `sh_info` field.
The existent `elf-reladyn-section-shinfo.yaml` which tests this piece has issues:
1) It does not check the case when we have more than one `SHT_REL[A]`
section with `sh_info == 0` in the object. Because of this it did not catch the issue.
Currently we print an excessive "Info" field:
```
- Name: .rela.dyn
Type: SHT_RELA
EntSize: 0x0000000000000018
- Name: .rel.dyn
Type: SHT_REL
EntSize: 0x0000000000000010
Info: ' [1]'
```
2) It seems can be more generic. I've added a `rel-rela-section.yaml` instead.
Differential revision: https://reviews.llvm.org/D76281
Added:
llvm/test/tools/obj2yaml/rel-rela-section.yaml
Modified:
llvm/tools/obj2yaml/elf2yaml.cpp
Removed:
llvm/test/tools/obj2yaml/elf-reladyn-section-shinfo.yaml
################################################################################
diff --git a/llvm/test/tools/obj2yaml/elf-reladyn-section-shinfo.yaml b/llvm/test/tools/obj2yaml/elf-reladyn-section-shinfo.yaml
deleted file mode 100644
index 0f2906470f3d..000000000000
--- a/llvm/test/tools/obj2yaml/elf-reladyn-section-shinfo.yaml
+++ /dev/null
@@ -1,44 +0,0 @@
-# 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/test/tools/obj2yaml/rel-rela-section.yaml b/llvm/test/tools/obj2yaml/rel-rela-section.yaml
new file mode 100644
index 000000000000..a29c2b2cc1e3
--- /dev/null
+++ b/llvm/test/tools/obj2yaml/rel-rela-section.yaml
@@ -0,0 +1,31 @@
+## This is a generic test for SHT_REL/SHT_RELA sections.
+
+## Check that we do not print excessive default
+## fields for SHT_REL[A] sections.
+# RUN: yaml2obj %s -o %t1
+# RUN: obj2yaml %t1 | FileCheck %s --check-prefix=YAML
+
+## Note: it is important to have at least two sections with sh_info == 0.
+## Previously we printed a broken Info field in this case.
+## FIXME: We should not print EntSize. Will be fixed by https://reviews.llvm.org/D76227.
+# YAML: - Name: .rela.dyn
+# YAML-NEXT: Type: SHT_RELA
+# YAML-NEXT: EntSize: 0x0000000000000018
+# YAML-NEXT: - Name: .rel.dyn
+# YAML-NEXT: Type: SHT_REL
+# YAML-NEXT: EntSize: 0x0000000000000010
+# YAML-NEXT: - Name
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .rela.dyn
+ Type: SHT_RELA
+ - Name: .rel.dyn
+ Type: SHT_REL
+## Trigger the .dynsym emission.
+DynamicSymbols: []
diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp
index 180457bb6d91..e6bdc1f5dc0f 100644
--- a/llvm/tools/obj2yaml/elf2yaml.cpp
+++ b/llvm/tools/obj2yaml/elf2yaml.cpp
@@ -575,6 +575,11 @@ Error ELFDumper<ELFT>::dumpCommonRelocationSection(
if (Error E = dumpCommonSection(Shdr, S))
return E;
+ // Having a zero sh_info field is normal: .rela.dyn is a dynamic
+ // relocation section that normally has no value in this field.
+ if (!Shdr->sh_info)
+ return Error::success();
+
auto InfoSection = Obj.getSection(Shdr->sh_info);
if (!InfoSection)
return InfoSection.takeError();
More information about the llvm-commits
mailing list