[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