[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:
Sid Manning 2019-11-05 11:13:18 -08:00 committed by Fangrui Song
parent f1b4c4bfd0
commit 6cd47f9dd7
2 changed files with 39 additions and 0 deletions

View File

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

View File

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