forked from OSchip/llvm-project
[yaml2obj] - Allow overriding sh_entsize for SHT_GNU_versym sections.
This allows to write a test case for one of untested errors in llvm/Object/ELF.h. I did it in this patch to demonstrate. Differential revision: https://reviews.llvm.org/D65394 llvm-svn: 367860
This commit is contained in:
parent
2a48176373
commit
149aa2f7fc
|
@ -547,8 +547,9 @@ template <typename T>
|
|||
Expected<const T *> ELFFile<ELFT>::getEntry(const Elf_Shdr *Section,
|
||||
uint32_t Entry) const {
|
||||
if (sizeof(T) != Section->sh_entsize)
|
||||
// TODO: this error is untested.
|
||||
return createError("invalid sh_entsize");
|
||||
return createError("section " + getSecIndexForError(this, Section) +
|
||||
" has invalid sh_entsize: expected " + Twine(sizeof(T)) +
|
||||
", but got " + Twine(Section->sh_entsize));
|
||||
size_t Pos = Section->sh_offset + Entry * sizeof(T);
|
||||
if (Pos + sizeof(T) > Buf.size())
|
||||
return createError("unable to access section " +
|
||||
|
|
|
@ -627,3 +627,28 @@ Sections:
|
|||
Content: ""
|
||||
Symbols:
|
||||
- Name: foo
|
||||
|
||||
## Check that we report an error if SHT_GNU_versym has invalid
|
||||
## sh_entsize value (3 instead of 2) when trying to access the entries.
|
||||
|
||||
# RUN: yaml2obj %s --docnum=30 -o %t30
|
||||
# RUN: not llvm-readobj -V %t30 2>&1 | FileCheck --check-prefix=INVALID-VER-SHENTSIZE %s
|
||||
|
||||
# INVALID-VER-SHENTSIZE: error: section [index 1] has invalid sh_entsize: expected 2, but got 3
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
OSABI: ELFOSABI_FREEBSD
|
||||
Type: ET_DYN
|
||||
Machine: EM_X86_64
|
||||
Sections:
|
||||
- Name: .gnu.version
|
||||
Type: SHT_GNU_versym
|
||||
EntSize: 0x0000000000000003
|
||||
Entries: [ ]
|
||||
## Needed to trigger creation of .dynsym.
|
||||
DynamicSymbols:
|
||||
- Name: foo
|
||||
Binding: STB_GLOBAL
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
# RUN: yaml2obj %s -o %t
|
||||
# RUN: llvm-readobj -V %t | FileCheck %s
|
||||
|
||||
## Check we are able to produce a valid SHT_GNU_versym
|
||||
## section from its description.
|
||||
|
||||
# RUN: yaml2obj --docnum=1 %s -o %t1
|
||||
# RUN: llvm-readobj -V %t1 | FileCheck %s
|
||||
|
||||
# CHECK: Version symbols {
|
||||
# CHECK-NEXT: Section Name: .gnu.version
|
||||
# CHECK-NEXT: Address: 0x200210
|
||||
|
@ -89,3 +89,25 @@ DynamicSymbols:
|
|||
- Name: f2
|
||||
Binding: STB_GLOBAL
|
||||
...
|
||||
|
||||
## Check we are able to set custom sh_entsize field for SHT_GNU_versym section.
|
||||
|
||||
# RUN: yaml2obj --docnum=2 %s -o %t2
|
||||
# RUN: llvm-readelf -S %t2 | FileCheck %s --check-prefix=ENTSIZE
|
||||
|
||||
# ENTSIZE: Section Headers:
|
||||
# ENTSIZE: [Nr] Name Type Address Off Size ES
|
||||
# ENTSIZE: [ 1] .gnu.version VERSYM 0000000000000000 000180 000000 03
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
OSABI: ELFOSABI_FREEBSD
|
||||
Type: ET_DYN
|
||||
Machine: EM_X86_64
|
||||
Sections:
|
||||
- Name: .gnu.version
|
||||
Type: SHT_GNU_versym
|
||||
EntSize: 0x0000000000000003
|
||||
Entries: [ ]
|
||||
|
|
|
@ -796,7 +796,7 @@ bool ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
|
|||
for (uint16_t Version : Section.Entries)
|
||||
support::endian::write<uint16_t>(OS, Version, ELFT::TargetEndianness);
|
||||
|
||||
SHeader.sh_entsize = 2;
|
||||
SHeader.sh_entsize = Section.EntSize ? (uint64_t)*Section.EntSize : 2;
|
||||
SHeader.sh_size = Section.Entries.size() * SHeader.sh_entsize;
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue