forked from OSchip/llvm-project
[llvm-objdump] Fix spurious "The end of the file was unexpectedly encountered" if a SHT_NOBITS sh_offset is larger than the file size
llvm-objdump -D this file: int a[100000]; int main() { return 0; } Will produce an error: "The end of the file was unexpectedly encountered". This happens because of a check in Binary.h checkOffset. (Addr + Size > M.getBufferEnd()). The sh_offset and sh_size fields can be ignored for SHT_NOBITS sections. Fix the error by changing ELFObjectFile<ELFT>::getSectionContents to use the file base for SHT_NOBITS sections. Reviewed By: grimar, MaskRay Differential Revision: https://reviews.llvm.org/D69192
This commit is contained in:
parent
f1b4c4bfd0
commit
6cd47f9dd7
|
@ -723,6 +723,8 @@ template <class ELFT>
|
||||||
Expected<ArrayRef<uint8_t>>
|
Expected<ArrayRef<uint8_t>>
|
||||||
ELFObjectFile<ELFT>::getSectionContents(DataRefImpl Sec) const {
|
ELFObjectFile<ELFT>::getSectionContents(DataRefImpl Sec) const {
|
||||||
const Elf_Shdr *EShdr = getSection(Sec);
|
const Elf_Shdr *EShdr = getSection(Sec);
|
||||||
|
if (EShdr->sh_type == ELF::SHT_NOBITS)
|
||||||
|
return makeArrayRef((const uint8_t *)base(), 0);
|
||||||
if (std::error_code EC =
|
if (std::error_code EC =
|
||||||
checkOffset(getMemoryBufferRef(),
|
checkOffset(getMemoryBufferRef(),
|
||||||
(uintptr_t)base() + EShdr->sh_offset, EShdr->sh_size))
|
(uintptr_t)base() + EShdr->sh_offset, EShdr->sh_size))
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
## Check that when BSS is larger than the file llvm-objdump doesn't
|
||||||
|
## assert with an unexpected end of file error.
|
||||||
|
# RUN: yaml2obj --docnum=1 %s > %t
|
||||||
|
# RUN: yaml2obj --docnum=2 %s > %t.2
|
||||||
|
# RUN: llvm-objdump -D %t | FileCheck %s
|
||||||
|
# RUN: llvm-objdump -D %t.2 | FileCheck %s
|
||||||
|
|
||||||
|
# CHECK: Disassembly of section .bss:
|
||||||
|
# CHECK: .bss:
|
||||||
|
# CHECK-NEXT: ...
|
||||||
|
|
||||||
|
--- !ELF
|
||||||
|
FileHeader:
|
||||||
|
Class: ELFCLASS64
|
||||||
|
Data: ELFDATA2LSB
|
||||||
|
Type: ET_EXEC
|
||||||
|
Machine: EM_X86_64
|
||||||
|
Sections:
|
||||||
|
- Name: .bss
|
||||||
|
Type: SHT_NOBITS
|
||||||
|
Flags: [ SHF_WRITE, SHF_ALLOC ]
|
||||||
|
Size: 0x0000000000001000
|
||||||
|
...
|
||||||
|
|
||||||
|
--- !ELF
|
||||||
|
FileHeader:
|
||||||
|
Class: ELFCLASS64
|
||||||
|
Data: ELFDATA2LSB
|
||||||
|
Type: ET_EXEC
|
||||||
|
Machine: EM_X86_64
|
||||||
|
Sections:
|
||||||
|
- Name: .bss
|
||||||
|
Type: SHT_NOBITS
|
||||||
|
Flags: [ SHF_WRITE, SHF_ALLOC ]
|
||||||
|
Size: 0x0000000000001000
|
||||||
|
ShOffset: 0x0000000080000000
|
||||||
|
...
|
Loading…
Reference in New Issue