mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
16779dce78
The ELF spec says: > STT_FILE: Conventionally, the symbol's name gives the name of the source file associated with the object file. A file symbol has STB_LOCAL binding, its section index is SHN_ABS, and it precedes the other STB_LOCAL symbols for the file, if it is present. For a local symbol, the preceding STT_FILE symbol is almost always in the same file[1]. GNU addr2line uses this heuristic to retrieve the filename associated with a local symbol (e.g. internal linkage functions in C/C++). GNU addr2line can assign STT_FILE filename to a non-local symbol, too, but the trick only works if no regular symbol precede STT_FILE. This patch does not implement this corner case (not useful for most executables which have more than one files). In case of filename mismatch between .debug_line & .symtab, arbitrarily make .debug_line win. [1]: LLD does not synthesize STT_FILE symbols (https://bugs.llvm.org/show_bug.cgi?id=48023 see also https://sourceware.org/bugzilla/show_bug.cgi?id=26822). An assembly file without `.file` directives can cause mis-attribution. This is an edge case. Differential Revision: https://reviews.llvm.org/D95927
76 lines
1.8 KiB
YAML
76 lines
1.8 KiB
YAML
# RUN: yaml2obj --docnum=1 %s -o %t1
|
|
# RUN: llvm-symbolizer --obj=%t1 0 1 2 | FileCheck %s
|
|
|
|
## The local symbol has no preceding STT_FILE. Its filename is unavailable.
|
|
# CHECK: local
|
|
# CHECK-NEXT: ??:0:0
|
|
# CHECK-EMPTY:
|
|
|
|
## All local symbols precede all non-local symbols. When there are multiple
|
|
## STT_FILE symbols, we cannot tell which file defines the non-local symbol in
|
|
## question. We could tell if there is only one STT_FILE but in reality there
|
|
## are always more than one file, so implementing the special case is not useful.
|
|
# CHECK-NEXT: global
|
|
# CHECK-NEXT: ??:0:0
|
|
# CHECK-EMPTY:
|
|
# CHECK-NEXT: weak
|
|
# CHECK-NEXT: ??:0:0
|
|
# CHECK-EMPTY:
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_DYN
|
|
Machine: EM_X86_64
|
|
Sections:
|
|
- Name: .text
|
|
Type: SHT_PROGBITS
|
|
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
|
|
Size: 3
|
|
Symbols:
|
|
- Name: local
|
|
Section: .text
|
|
Value: 0
|
|
- Name: 1.c
|
|
Type: STT_FILE
|
|
Index: SHN_ABS
|
|
- Name: global
|
|
Binding: STB_GLOBAL
|
|
Section: .text
|
|
Value: 1
|
|
- Name: weak
|
|
Binding: STB_WEAK
|
|
Section: .text
|
|
Value: 2
|
|
|
|
## If st_name of the STT_FILE symbols is invalid, the symbol name is lost as well.
|
|
## TODO Keep the symbol name.
|
|
# RUN: yaml2obj --docnum=2 %s -o %t2
|
|
# RUN: llvm-symbolizer --obj=%t2 0 0 2>&1 | FileCheck %s --check-prefix=CHECK2
|
|
|
|
# CHECK2: error reading file: st_name (0xffff) is past the end of the string table of size
|
|
# CHECK2-NEXT: ??
|
|
# CHECK2-NEXT: ??:0:0
|
|
# CHECK2-EMPTY:
|
|
# CHECK2-NEXT: ??
|
|
# CHECK2-NEXT: ??:0:0
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_DYN
|
|
Machine: EM_X86_64
|
|
Sections:
|
|
- Name: .text
|
|
Type: SHT_PROGBITS
|
|
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
|
|
Size: 1
|
|
Symbols:
|
|
- StName: 0xffff
|
|
Type: STT_FILE
|
|
Index: SHN_ABS
|
|
- Name: local
|
|
Section: .text
|