[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
This commit is contained in:
Georgii Rymar 2020-03-17 16:25:44 +03:00
parent 4a7f2032a3
commit e26e9ba288
3 changed files with 36 additions and 44 deletions

View File

@ -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

View File

@ -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: []

View File

@ -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();