Linkers (ld.bfd/gold/lld) place the section header table at the very end. This allows tools to strip it, which is optional in executable/shared objects. In addition, if we add or section, the size of the section header table will change. Placing the section header table in the end keeps section offsets unchanged. yaml2obj currently places the section header table immediately after the program header. Follow what linkers do to make offset updating easier. Reviewed By: grimar Differential Revision: https://reviews.llvm.org/D67221 llvm-svn: 371074
191 lines
6.4 KiB
Plaintext
191 lines
6.4 KiB
Plaintext
## Test tools are able to dump different types of notes.
|
|
|
|
# RUN: yaml2obj --docnum=1 %s > %t1.so
|
|
# RUN: llvm-readelf --notes %t1.so | FileCheck %s --check-prefix=GNU --strict-whitespace --match-full-lines
|
|
# RUN: llvm-readobj --notes %t1.so | FileCheck %s --check-prefix=LLVM
|
|
# RUN: llvm-objcopy --strip-sections %t1.so %t1.stripped.so
|
|
# RUN: llvm-readelf --notes %t1.stripped.so | FileCheck %s --check-prefix=GNU-STRIPPED --strict-whitespace --match-full-lines
|
|
# RUN: llvm-readobj --notes %t1.stripped.so | FileCheck %s --check-prefix=LLVM-STRIPPED
|
|
|
|
# GNU:Displaying notes found at file offset 0x00000078 with length 0x00000020:
|
|
# GNU-NEXT: Owner Data size Description
|
|
# GNU-NEXT: GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
|
|
# GNU-NEXT: OS: Linux, ABI: 2.6.32
|
|
|
|
# GNU:Displaying notes found at file offset 0x00000098 with length 0x00000020:
|
|
# GNU-NEXT: Owner Data size Description
|
|
# GNU-NEXT: GNU 0x00000010 NT_GNU_BUILD_ID (unique build ID bitstring)
|
|
# GNU-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b
|
|
|
|
# GNU:Displaying notes found at file offset 0x000000b8 with length 0x0000001c:
|
|
# GNU-NEXT: Owner Data size Description
|
|
# GNU-NEXT: GNU 0x00000009 NT_GNU_GOLD_VERSION (gold version)
|
|
# GNU-NEXT: Version: gold 1.11
|
|
|
|
# LLVM: Notes [
|
|
# LLVM-NEXT: NoteSection {
|
|
# LLVM-NEXT: Offset: 0x78
|
|
# LLVM-NEXT: Size: 0x20
|
|
# LLVM-NEXT: Note {
|
|
# LLVM-NEXT: Owner: GNU
|
|
# LLVM-NEXT: Data size: 0x10
|
|
# LLVM-NEXT: Type: NT_GNU_ABI_TAG (ABI version tag)
|
|
# LLVM-NEXT: OS: Linux
|
|
# LLVM-NEXT: ABI: 2.6.32
|
|
# LLVM-NEXT: }
|
|
# LLVM-NEXT: }
|
|
# LLVM-NEXT: NoteSection {
|
|
# LLVM-NEXT: Offset: 0x98
|
|
# LLVM-NEXT: Size: 0x20
|
|
# LLVM-NEXT: Note {
|
|
# LLVM-NEXT: Owner: GNU
|
|
# LLVM-NEXT: Data size: 0x10
|
|
# LLVM-NEXT: Type: NT_GNU_BUILD_ID (unique build ID bitstring)
|
|
# LLVM-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b
|
|
# LLVM-NEXT: }
|
|
# LLVM-NEXT: }
|
|
# LLVM-NEXT: NoteSection {
|
|
# LLVM-NEXT: Offset: 0xB8
|
|
# LLVM-NEXT: Size: 0x1C
|
|
# LLVM-NEXT: Note {
|
|
# LLVM-NEXT: Owner: GNU
|
|
# LLVM-NEXT: Data size: 0x9
|
|
# LLVM-NEXT: Type: NT_GNU_GOLD_VERSION (gold version)
|
|
# LLVM-NEXT: Version: gold 1.11
|
|
# LLVM-NEXT: }
|
|
# LLVM-NEXT: }
|
|
# LLVM-NEXT: ]
|
|
|
|
# LLVM-STRIPPED: Notes [
|
|
# LLVM-STRIPPED-NEXT: NoteSection {
|
|
# LLVM-STRIPPED-NEXT: Offset: 0x78
|
|
# LLVM-STRIPPED-NEXT: Size: 0x20
|
|
# LLVM-STRIPPED-NEXT: Note {
|
|
# LLVM-STRIPPED-NEXT: Owner: GNU
|
|
# LLVM-STRIPPED-NEXT: Data size: 0x10
|
|
# LLVM-STRIPPED-NEXT: Type: NT_GNU_BUILD_ID (unique build ID bitstring)
|
|
# LLVM-STRIPPED-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b
|
|
# LLVM-STRIPPED-NEXT: }
|
|
# LLVM-STRIPPED-NEXT: }
|
|
# LLVM-STRIPPED-NEXT: ]
|
|
|
|
# GNU-STRIPPED:Displaying notes found at file offset 0x00000078 with length 0x00000020:
|
|
# GNU-STRIPPED-NEXT: Owner Data size Description
|
|
# GNU-STRIPPED-NEXT: GNU 0x00000010 NT_GNU_BUILD_ID (unique build ID bitstring)
|
|
# GNU-STRIPPED-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_EXEC
|
|
Machine: EM_X86_64
|
|
Sections:
|
|
- Name: .note.ABI-tag
|
|
Type: SHT_NOTE
|
|
AddressAlign: 0x0000000000000004
|
|
Content: 040000001000000001000000474E550000000000020000000600000020000000
|
|
- Name: .note.gnu.build-id
|
|
Type: SHT_NOTE
|
|
Flags: [ SHF_ALLOC ]
|
|
Address: 0x0000000000400120
|
|
AddressAlign: 0x0000000000000004
|
|
Content: 040000001000000003000000474E55004FCB712AA6387724A9F465A32CD8C14B
|
|
- Name: .note.gnu.gold-version
|
|
Type: SHT_NOTE
|
|
AddressAlign: 0x0000000000000004
|
|
Content: 040000000900000004000000474E5500676F6C6420312E3131000000
|
|
ProgramHeaders:
|
|
- Type: PT_NOTE
|
|
FileSize: 0x20
|
|
Sections:
|
|
- Section: .note.gnu.build-id
|
|
|
|
## Test tools report an error if a note section has an invalid offset
|
|
## that goes past the end of file.
|
|
|
|
# RUN: yaml2obj --docnum=2 %s > %t2.so
|
|
# RUN: not llvm-readelf --notes %t2.so 2>&1 | FileCheck -DFILE=%t2.so %s --check-prefix=ERR1
|
|
# RUN: not llvm-readobj --notes %t2.so 2>&1 | FileCheck -DFILE=%t2.so %s --check-prefix=ERR1
|
|
|
|
# ERR1: error: '[[FILE]]': SHT_NOTE section [index 1] has invalid offset (0xffff0000) or size (0x0)
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_EXEC
|
|
Machine: EM_X86_64
|
|
Sections:
|
|
- Name: .note
|
|
Type: SHT_NOTE
|
|
ShOffset: 0xffff0000
|
|
|
|
## Test tools report an error if a note section has invalid size
|
|
## that goes past the end of file.
|
|
|
|
# RUN: yaml2obj --docnum=3 %s > %t3.so
|
|
# RUN: not llvm-readelf --notes %t3.so 2>&1 | FileCheck -DFILE=%t3.so %s --check-prefix=ERR2
|
|
# RUN: not llvm-readobj --notes %t3.so 2>&1 | FileCheck -DFILE=%t3.so %s --check-prefix=ERR2
|
|
|
|
# ERR2: error: '[[FILE]]': SHT_NOTE section [index 1] has invalid offset (0x40) or size (0xffff0000)
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_EXEC
|
|
Machine: EM_X86_64
|
|
Sections:
|
|
- Name: .note
|
|
Type: SHT_NOTE
|
|
ShSize: 0xffff0000
|
|
|
|
## Test tools report an error if a note program header has an invalid offset that
|
|
## goes past the end of file.
|
|
|
|
# RUN: yaml2obj --docnum=4 %s > %t4.so
|
|
# RUN: not llvm-readelf --notes %t4.so 2>&1 | FileCheck -DFILE=%t4.so %s --check-prefix=ERR3
|
|
# RUN: not llvm-readobj --notes %t4.so 2>&1 | FileCheck -DFILE=%t4.so %s --check-prefix=ERR3
|
|
|
|
# ERR3: error: '[[FILE]]': 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 -DFILE=%t5.so %s --check-prefix=ERR4
|
|
# RUN: not llvm-readobj --notes %t5.so 2>&1 | FileCheck -DFILE=%t5.so %s --check-prefix=ERR4
|
|
|
|
# ERR4: error: '[[FILE]]': PT_NOTE header has invalid offset (0x78) 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
|