1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

[llvm-readelf/obj] - Refine the error message about the broken string table.

This:
1) Changes `reportWarning` to `reportUniqueWarning` (no-op here).
2) Adds more context to the message.
3) Merges `broken-dynsym-link.test` into `dyn-symbols.test`, adds more testing.

Differential revision: https://reviews.llvm.org/D92380
This commit is contained in:
Georgii Rymar 2020-12-01 13:59:47 +03:00
parent babe0d225d
commit 6340cbbc6f
3 changed files with 65 additions and 58 deletions

View File

@ -1,57 +0,0 @@
## Test that we are able to dump section headers even if the
## .dynsym section's sh_link field is broken.
## Case 1: sh_link is set to 0.
# RUN: yaml2obj --docnum=1 -DLINK=0 %s -o %t1
# RUN: llvm-readobj -S %t1 2>&1 | FileCheck %s -DFILE=%t1 --check-prefixes=LLVM,ERR
# RUN: llvm-readelf -S %t1 2>&1 | FileCheck %s -DFILE=%t1 --check-prefixes=GNU,ERR
# ERR: warning: '[[FILE]]': invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL
# LLVM: Name: .dynsym
# LLVM-NEXT: Type: SHT_DYNSYM
# LLVM-NEXT: Flags [
# LLVM-NEXT: SHF_ALLOC
# LLVM-NEXT: ]
# LLVM-NEXT: Address: 0x0
# LLVM-NEXT: Offset: 0x40
# LLVM-NEXT: Size: 24
# LLVM-NEXT: Link: 0
# GNU: Section Headers:
# GNU-NEXT: [Nr] Name Type Address Off Size ES Flg Lk
# GNU-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0
# GNU-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000040 000018 18 A 0
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Sections:
- Name: .dynsym
Type: SHT_DYNSYM
Link: [[LINK]]
## Case 2: sh_link is set to 255, which is larger than the number of the sections.
# RUN: yaml2obj --docnum=1 -DLINK=255 %s -o %t2
# RUN: llvm-readobj -S %t2 2>&1 | FileCheck -DFILE=%t2 %s --check-prefixes=LLVM2,ERR2
# RUN: llvm-readelf -S %t2 2>&1 | FileCheck -DFILE=%t2 %s --check-prefixes=GNU2,ERR2
# ERR2: warning: '[[FILE]]': invalid section index: 255
# LLVM2: Name: .dynsym
# LLVM2-NEXT: Type: SHT_DYNSYM
# LLVM2-NEXT: Flags [
# LLVM2-NEXT: SHF_ALLOC
# LLVM2-NEXT: ]
# LLVM2-NEXT: Address: 0x0
# LLVM2-NEXT: Offset: 0x40
# LLVM2-NEXT: Size: 24
# LLVM2-NEXT: Link: 255
# GNU2: Section Headers:
# GNU2-NEXT: [Nr] Name Type Address Off Size ES Flg Lk
# GNU2-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0
# GNU2-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000040 000018 18 A 255

View File

@ -610,6 +610,7 @@ Sections:
- Name: .dynsym
Type: SHT_DYNSYM
EntSize: [[ENTSIZE=<none>]]
Link: [[LINK=<none>]]
ShOffset: [[OFFSET=<none>]]
ShSize: [[SIZE=<none>]]
DynamicSymbols:
@ -642,3 +643,65 @@ DynamicSymbols:
# SIZE-BROKEN-LLVM: DynamicSymbols [
# SIZE-BROKEN-LLVM-NEXT: ]
## d) check we report a warning when the sh_link field of the SHT_DYNSYM section
## is not a valid section index or is not an index of a valid string table.
# RUN: yaml2obj --docnum=14 %s -DLINK=0xffffffff -o %t16.link
# RUN: llvm-readobj %t16.link --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link \
# RUN: --check-prefixes=LINK-BROKEN1,LINK-BROKEN-LLVM --implicit-check-not=warning:
# RUN: llvm-readelf %t16.link --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link \
# RUN: --check-prefixes=LINK-BROKEN1,LINK-BROKEN-GNU --implicit-check-not=warning:
## Also test that we are able to dump section headers even if the .dynsym section's sh_link field is broken.
# RUN: llvm-readobj %t16.link --section-headers --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link \
# RUN: --check-prefixes=LINK-BROKEN1,LINK-SEC-HDRS-LLVM,LINK-BROKEN-LLVM --implicit-check-not=warning:
# RUN: llvm-readelf %t16.link --section-headers --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link \
# RUN: --check-prefixes=LINK-BROKEN1,LINK-SEC-HDRS-GNU,LINK-BROKEN-GNU
# RUN: yaml2obj --docnum=14 %s -DLINK=0x0 -o %t16.link.0
# RUN: llvm-readobj %t16.link.0 --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link.0 \
# RUN: --check-prefixes=LINK-BROKEN2,LINK-BROKEN-LLVM --implicit-check-not=warning:
# RUN: llvm-readelf %t16.link.0 --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link.0 \
# RUN: --check-prefixes=LINK-BROKEN2,LINK-BROKEN-GNU --implicit-check-not=warning:
## Also test that we are able to dump section headers even if the .dynsym section's sh_link field is broken.
# RUN: llvm-readobj %t16.link.0 --section-headers --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link.0 \
# RUN: --check-prefixes=LINK-BROKEN2,LINK-SEC-HDRS-LLVM,LINK-BROKEN-LLVM --implicit-check-not=warning:
# RUN: llvm-readelf %t16.link.0 --section-headers --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link.0 \
# RUN: --check-prefixes=LINK-BROKEN2,LINK-SEC-HDRS-GNU,LINK-BROKEN-GNU --implicit-check-not=warning:
# LINK-BROKEN1: warning: '[[FILE]]': unable to get the string table for the SHT_DYNSYM section with index 1: invalid section index: 4294967295
# LINK-BROKEN2: warning: '[[FILE]]': unable to get the string table for the SHT_DYNSYM section with index 1: invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL
# LINK-SEC-HDRS-LLVM: Sections [
# LINK-SEC-HDRS-GNU: There are 5 section headers, starting at offset 0x80:
# LINK-BROKEN-LLVM: DynamicSymbols [
# LINK-BROKEN-LLVM-NEXT: warning: '[[FILE]]': st_name (0x0) is past the end of the string table of size 0x0
# LINK-BROKEN-LLVM-NEXT: Symbol {
# LINK-BROKEN-LLVM-NEXT: Name: <?> (0)
# LINK-BROKEN-LLVM-NEXT: Value: 0x0
# LINK-BROKEN-LLVM-NEXT: Size: 0
# LINK-BROKEN-LLVM-NEXT: Binding: Local (0x0)
# LINK-BROKEN-LLVM-NEXT: Type: None (0x0)
# LINK-BROKEN-LLVM-NEXT: Other: 0
# LINK-BROKEN-LLVM-NEXT: Section: Undefined (0x0)
# LINK-BROKEN-LLVM-NEXT: }
# LINK-BROKEN-LLVM-NEXT: warning: '[[FILE]]': st_name (0x1) is past the end of the string table of size 0x0
# LINK-BROKEN-LLVM-NEXT: Symbol {
# LINK-BROKEN-LLVM-NEXT: Name: <?> (1)
# LINK-BROKEN-LLVM-NEXT: Value: 0x0
# LINK-BROKEN-LLVM-NEXT: Size: 0
# LINK-BROKEN-LLVM-NEXT: Binding: Local (0x0)
# LINK-BROKEN-LLVM-NEXT: Type: None (0x0)
# LINK-BROKEN-LLVM-NEXT: Other: 0
# LINK-BROKEN-LLVM-NEXT: Section: Undefined (0x0)
# LINK-BROKEN-LLVM-NEXT: }
# LINK-BROKEN-LLVM-NEXT: ]
# LINK-BROKEN-GNU: Symbol table '.dynsym' contains 2 entries:
# LINK-BROKEN-GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name
# LINK-BROKEN-GNU-NEXT: warning: '[[FILE]]': st_name (0x0) is past the end of the string table of size 0x0
# LINK-BROKEN-GNU-NEXT: 0: 00000000 0 NOTYPE LOCAL DEFAULT UND <?>
# LINK-BROKEN-GNU-NEXT: warning: '[[FILE]]': st_name (0x1) is past the end of the string table of size 0x0
# LINK-BROKEN-GNU-NEXT: 1: 00000000 0 NOTYPE LOCAL DEFAULT UND <?>

View File

@ -2044,7 +2044,8 @@ ELFDumper<ELFT>::ELFDumper(const object::ELFObjectFile<ELFT> &O,
if (Expected<StringRef> E = Obj.getStringTableForSymtab(Sec))
DynamicStringTable = *E;
else
reportWarning(E.takeError(), ObjF.getFileName());
reportUniqueWarning("unable to get the string table for the " +
describe(Sec) + ": " + toString(E.takeError()));
} else {
reportUniqueWarning("unable to read dynamic symbols from " +
describe(Sec) + ": " +