Revert r365775 - "[Object/ELF] - Improve error reporting for notes."

It broke BB: http://lab.llvm.org:8011/builders/clang-x86_64-debian-fast/builds/15419

llvm-svn: 365779
This commit is contained in:
George Rimar 2019-07-11 14:03:27 +00:00
parent 34564324f8
commit 36e9592455
2 changed files with 89 additions and 126 deletions

View File

@ -201,11 +201,14 @@ public:
/// \param Err [out] an error to support fallible iteration, which should /// \param Err [out] an error to support fallible iteration, which should
/// be checked after iteration ends. /// be checked after iteration ends.
Elf_Note_Iterator notes_begin(const Elf_Phdr &Phdr, Error &Err) const { Elf_Note_Iterator notes_begin(const Elf_Phdr &Phdr, Error &Err) const {
assert(Phdr.p_type == ELF::PT_NOTE && "Phdr is not of type PT_NOTE"); if (Phdr.p_type != ELF::PT_NOTE) {
// TODO: this error is untested.
Err = createError("attempt to iterate notes of non-note program header");
return Elf_Note_Iterator(Err);
}
if (Phdr.p_offset + Phdr.p_filesz > getBufSize()) { if (Phdr.p_offset + Phdr.p_filesz > getBufSize()) {
Err = createError("PT_NOTE header has invalid offset (0x" + // TODO: this error is untested.
Twine::utohexstr(Phdr.p_offset) + ") or size (0x" + Err = createError("invalid program header offset/size");
Twine::utohexstr(Phdr.p_filesz) + ")");
return Elf_Note_Iterator(Err); return Elf_Note_Iterator(Err);
} }
return Elf_Note_Iterator(base() + Phdr.p_offset, Phdr.p_filesz, Err); return Elf_Note_Iterator(base() + Phdr.p_offset, Phdr.p_filesz, Err);
@ -219,12 +222,14 @@ public:
/// \param Err [out] an error to support fallible iteration, which should /// \param Err [out] an error to support fallible iteration, which should
/// be checked after iteration ends. /// be checked after iteration ends.
Elf_Note_Iterator notes_begin(const Elf_Shdr &Shdr, Error &Err) const { Elf_Note_Iterator notes_begin(const Elf_Shdr &Shdr, Error &Err) const {
assert(Shdr.sh_type == ELF::SHT_NOTE && "Shdr is not of type SHT_NOTE"); if (Shdr.sh_type != ELF::SHT_NOTE) {
// TODO: this error is untested.
Err = createError("attempt to iterate notes of non-note section");
return Elf_Note_Iterator(Err);
}
if (Shdr.sh_offset + Shdr.sh_size > getBufSize()) { if (Shdr.sh_offset + Shdr.sh_size > getBufSize()) {
Err = createError("SHT_NOTE section " + getSecIndexForError(this, &Shdr) + // TODO: this error is untested.
" has invalid offset (0x" + Err = createError("invalid section offset/size");
Twine::utohexstr(Shdr.sh_offset) + ") or size (0x" +
Twine::utohexstr(Shdr.sh_size) + ")");
return Elf_Note_Iterator(Err); return Elf_Note_Iterator(Err);
} }
return Elf_Note_Iterator(base() + Shdr.sh_offset, Shdr.sh_size, Err); return Elf_Note_Iterator(base() + Shdr.sh_offset, Shdr.sh_size, Err);

View File

@ -1,27 +1,25 @@
## Test tools are able to dump different types of notes. # RUN: yaml2obj %s > %t.so
# RUN: llvm-readelf --notes %t.so | FileCheck %s --check-prefix=GNU
# RUN: llvm-readobj --elf-output-style LLVM --notes %t.so | FileCheck %s --check-prefix=LLVM
# RUN: yaml2obj --docnum=1 %s > %t1.so # GNU: Displaying notes found at file offset 0x00000340 with length 0x00000020:
# RUN: llvm-readelf --notes %t1.so | FileCheck %s --check-prefix=GNU
# RUN: llvm-readobj --notes %t1.so | FileCheck %s --check-prefix=LLVM
# GNU: Displaying notes found at file offset 0x00000200 with length 0x00000020:
# GNU-NEXT: Owner Data size Description # GNU-NEXT: Owner Data size Description
# GNU-NEXT: GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag) # GNU-NEXT: GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
# GNU-NEXT: OS: Linux, ABI: 2.6.32 # GNU-NEXT: OS: Linux, ABI: 2.6.32
# GNU: Displaying notes found at file offset 0x00000220 with length 0x00000020: # GNU: Displaying notes found at file offset 0x00000360 with length 0x00000020:
# GNU-NEXT: Owner Data size Description # GNU-NEXT: Owner Data size Description
# GNU-NEXT: GNU 0x00000010 NT_GNU_BUILD_ID (unique build ID bitstring) # GNU-NEXT: GNU 0x00000010 NT_GNU_BUILD_ID (unique build ID bitstring)
# GNU-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b # GNU-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b
# GNU: Displaying notes found at file offset 0x00000240 with length 0x0000001c: # GNU: Displaying notes found at file offset 0x000003cc with length 0x0000001c:
# GNU-NEXT: Owner Data size Description # GNU-NEXT: Owner Data size Description
# GNU-NEXT: GNU 0x00000009 NT_GNU_GOLD_VERSION (gold version) # GNU-NEXT: GNU 0x00000009 NT_GNU_GOLD_VERSION (gold version)
# GNU-NEXT: Version: gold 1.11 # GNU-NEXT: Version: gold 1.11
# LLVM: Notes [ # LLVM: Notes [
# LLVM-NEXT: NoteSection { # LLVM-NEXT: NoteSection {
# LLVM-NEXT: Offset: 0x200 # LLVM-NEXT: Offset: 0x340
# LLVM-NEXT: Size: 0x20 # LLVM-NEXT: Size: 0x20
# LLVM-NEXT: Note { # LLVM-NEXT: Note {
# LLVM-NEXT: Owner: GNU # LLVM-NEXT: Owner: GNU
@ -32,7 +30,7 @@
# LLVM-NEXT: } # LLVM-NEXT: }
# LLVM-NEXT: } # LLVM-NEXT: }
# LLVM-NEXT: NoteSection { # LLVM-NEXT: NoteSection {
# LLVM-NEXT: Offset: 0x220 # LLVM-NEXT: Offset: 0x360
# LLVM-NEXT: Size: 0x20 # LLVM-NEXT: Size: 0x20
# LLVM-NEXT: Note { # LLVM-NEXT: Note {
# LLVM-NEXT: Owner: GNU # LLVM-NEXT: Owner: GNU
@ -42,7 +40,7 @@
# LLVM-NEXT: } # LLVM-NEXT: }
# LLVM-NEXT: } # LLVM-NEXT: }
# LLVM-NEXT: NoteSection { # LLVM-NEXT: NoteSection {
# LLVM-NEXT: Offset: 0x240 # LLVM-NEXT: Offset: 0x3CC
# LLVM-NEXT: Size: 0x1C # LLVM-NEXT: Size: 0x1C
# LLVM-NEXT: Note { # LLVM-NEXT: Note {
# LLVM-NEXT: Owner: GNU # LLVM-NEXT: Owner: GNU
@ -55,110 +53,70 @@
--- !ELF --- !ELF
FileHeader: FileHeader:
Class: ELFCLASS64 Class: ELFCLASS64
Data: ELFDATA2LSB Data: ELFDATA2LSB
Type: ET_EXEC Type: ET_EXEC
Machine: EM_X86_64 Machine: EM_X86_64
Sections: Sections:
- Name: .note.ABI-tag - Name: .note.ABI-tag
Type: SHT_NOTE Type: SHT_NOTE
AddressAlign: 0x0000000000000004 AddressAlign: 0x0000000000000004
Content: 040000001000000001000000474E550000000000020000000600000020000000 Content: 040000001000000001000000474E550000000000020000000600000020000000
- Name: .note.gnu.build-id - Name: .note.gnu.build-id
Type: SHT_NOTE Type: SHT_NOTE
Flags: [ SHF_ALLOC ] Flags: [ SHF_ALLOC ]
Address: 0x0000000000400120 Address: 0x0000000000400120
AddressAlign: 0x0000000000000004 AddressAlign: 0x0000000000000004
Content: 040000001000000003000000474E55004FCB712AA6387724A9F465A32CD8C14B Content: 040000001000000003000000474E55004FCB712AA6387724A9F465A32CD8C14B
- Name: .note.gnu.gold-version - Name: .text
Type: SHT_NOTE Type: SHT_PROGBITS
AddressAlign: 0x0000000000000004 Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Content: 040000000900000004000000474E5500676F6C6420312E3131000000 Address: 0x0000000000400140
AddressAlign: 0x0000000000000001
## Test tools report an error if a note section has an invalid offset Content: 31C0C3
## that goes past the end of file. - Name: .eh_frame
Type: SHT_PROGBITS
# RUN: yaml2obj --docnum=2 %s > %t2.so Flags: [ SHF_ALLOC ]
# RUN: not llvm-readelf --notes %t2.so 2>&1 | FileCheck %s --check-prefix=ERR1 Address: 0x0000000000400148
# RUN: not llvm-readobj --notes %t2.so 2>&1 | FileCheck %s --check-prefix=ERR1 AddressAlign: 0x0000000000000008
Content: 1400000000000000017A5200017810011B0C070890010000140000001C000000D8FFFFFF030000000000000000000000
# ERR1: error: SHT_NOTE section [index 1] has invalid offset (0xffff0000) or size (0x0) - Name: .data
Type: SHT_PROGBITS
--- !ELF Flags: [ SHF_WRITE, SHF_ALLOC ]
FileHeader: Address: 0x0000000000401000
Class: ELFCLASS64 AddressAlign: 0x0000000000000001
Data: ELFDATA2LSB Content: ''
Type: ET_EXEC - Name: .bss
Machine: EM_X86_64 Type: SHT_NOBITS
Sections: Flags: [ SHF_WRITE, SHF_ALLOC ]
- Name: .note Address: 0x0000000000401000
Type: SHT_NOTE AddressAlign: 0x0000000000000001
ShOffset: 0xffff0000 - Name: .comment
Type: SHT_PROGBITS
## Test tools report an error if a note section has invalid size Flags: [ SHF_MERGE, SHF_STRINGS ]
## that goes past the end of file. AddressAlign: 0x0000000000000001
Content: 004743433A2028474E552920352E342E3000
# RUN: yaml2obj --docnum=3 %s > %t3.so - Name: .note.gnu.gold-version
# RUN: not llvm-readelf --notes %t3.so 2>&1 | FileCheck %s --check-prefix=ERR2 Type: SHT_NOTE
# RUN: not llvm-readobj --notes %t3.so 2>&1 | FileCheck %s --check-prefix=ERR2 AddressAlign: 0x0000000000000004
Content: 040000000900000004000000474E5500676F6C6420312E3131000000
# ERR2: error: SHT_NOTE section [index 1] has invalid offset (0x180) or size (0xffff0000) Symbols:
- Name: reduced.c
--- !ELF Type: STT_FILE
FileHeader: - Type: STT_FILE
Class: ELFCLASS64 - Name: main
Data: ELFDATA2LSB Type: STT_FUNC
Type: ET_EXEC Section: .text
Machine: EM_X86_64 Value: 0x0000000000400140
Sections: Size: 0x0000000000000003
- Name: .note Binding: STB_GLOBAL
Type: SHT_NOTE - Name: _edata
ShSize: 0xffff0000 Value: 0x0000000000401000
Binding: STB_GLOBAL
## Test tools report an error if a note program header has an invalid offset that - Name: __bss_start
## goes past the end of file. Value: 0x0000000000401000
Binding: STB_GLOBAL
# RUN: yaml2obj --docnum=4 %s > %t4.so - Name: _end
# RUN: not llvm-readelf --notes %t4.so 2>&1 | FileCheck %s --check-prefix=ERR3 Value: 0x0000000000401000
# RUN: not llvm-readobj --notes %t4.so 2>&1 | FileCheck %s --check-prefix=ERR3 Binding: STB_GLOBAL
...
# ERR3: error: PT_NOTE header has invalid offset (0xffff0000) or size (0x0)
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_CORE
Machine: EM_X86_64
Sections:
- Name: .note
Type: SHT_NOTE
ProgramHeaders:
- Type: PT_NOTE
Offset: 0xffff0000
Sections:
- Section: .note
## Test tools report an error if a note program header has an invalid size that
## goes past the end of file.
# RUN: yaml2obj --docnum=5 %s > %t5.so
# RUN: not llvm-readelf --notes %t5.so 2>&1 | FileCheck %s --check-prefix=ERR4
# RUN: not llvm-readobj --notes %t5.so 2>&1 | FileCheck %s --check-prefix=ERR4
# ERR4: error: PT_NOTE header has invalid offset (0x1b8) or size (0xffff0000)
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_CORE
Machine: EM_X86_64
Sections:
- Name: .note
Type: SHT_NOTE
ProgramHeaders:
- Type: PT_NOTE
FileSize: 0xffff0000
Sections:
- Section: .note