## Show that when "DATA" is used with an address, it forces the found location ## to be symbolized as data, including the source information. # RUN: yaml2obj %s -o %t.so # RUN: llvm-symbolizer 'DATA 0x304d0' 'DATA 0x304d1' 'DATA 0x304d3' \ # RUN: 'DATA 0x304c0' 'DATA 0x304c8' 'DATA 0x304d4' 'DATA 0x304dc' \ # RUN: 'DATA 0x304d8' --obj=%t.so | FileCheck %s # CHECK: bss_global # CHECK-NEXT: {{[0-9]+}} 4 # CHECK-NEXT: /tmp/file.cpp:1 # CHECK-EMPTY: ## Check that lookups in the middle of the symbol are also resolved correctly. # CHECK: bss_global # CHECK-NEXT: {{[0-9]+}} 4 # CHECK-NEXT: /tmp/file.cpp:1 # CHECK-EMPTY: # CHECK: bss_global # CHECK-NEXT: {{[0-9]+}} 4 # CHECK-NEXT: /tmp/file.cpp:1 # CHECK-EMPTY: ## Now, the remainder of the symbols. # CHECK-NEXT: data_global # CHECK-NEXT: {{[0-9]+}} 4 # CHECK-NEXT: /tmp/file.cpp:2 # CHECK-EMPTY: # CHECK-NEXT: str # CHECK-NEXT: {{[0-9]+}} 8 # CHECK-NEXT: /tmp/file.cpp:4 # CHECK-EMPTY: # CHECK-NEXT: f()::function_global # CHECK-NEXT: {{[0-9]+}} 4 # CHECK-NEXT: /tmp/file.cpp:8 # CHECK-EMPTY: ## Including the one that includes an addend. # CHECK-NEXT: alpha # CHECK-NEXT: {{[0-9]+}} 4 # CHECK-NEXT: /tmp/file.cpp:12 # CHECK-EMPTY: # CHECK-NEXT: beta # CHECK-NEXT: {{[0-9]+}} 4 # CHECK-NEXT: /tmp/file.cpp:13 # CHECK-EMPTY: ## Ensure there's still a global that's offset-based. # RUN: llvm-dwarfdump --debug-info %t.so | FileCheck %s --check-prefix=OFFSET # OFFSET: DW_AT_location (DW_OP_addrx 0x4, DW_OP_plus_uconst 0x4) ################################################################################ ## File below was generated using: ## ## $ clang++ -g -O3 /tmp/file.cpp -shared -fuse-ld=lld -nostdlib \ ## -target aarch64-linux-gnuabi -mllvm -global-merge-ignore-single-use \ ## -o /tmp/file.so ## ## With /tmp/file.cpp as: ## 1: int bss_global; ## 2: int data_global = 2; ## 3: ## 4: const char* str = ## 5: "12345678"; ## 6: ## 7: int* f() { ## 8: static int function_global; ## 9: return &function_global; ## 10: } ## 11: ## 12: static int alpha; ## 13: static int beta; ## 14: int *f(bool b) { return beta ? &alpha : β } ## 15: ## ## ... then, one can get the offsets using `nm`, like: ## $ nm out.so | grep bss_global ## 00000000000038fc B bss_global ## ## Note the use of the aarch64 target (with -nostdlib in order to allow linkage ## without libraries for cross-compilation) as well as -O3 and ## -global-merge-ignore-single-use. This is a specific combination that makes ## the compiler emit the `alpha` global variable with a more complex ## DW_AT_location than just a DW_OP_addr/DW_OP_addrx. In this instance, it ## outputs a `DW_AT_location (DW_OP_addrx 0x4, DW_OP_plus_uconst 0x4)`. ## ## Ideally, this would be tested by invoking clang directly on a C source file, ## but unfortunately there's no way to do that for LLVM tests. The other option ## is to compile IR to an objfile, but llvm-symbolizer doesn't understand that ## two symbols can have the same address in different sections. In the code ## above, for example, we'd have bss_global at .bss+0x0, and data_global at ## .data+0x0, and so the symbolizer would only print one of them. Hence, we have ## the ugly dso-to-yaml blob below. ## ## For now, constant strings don't have a debuginfo entry, and so can't be ## symbolized correctly. In future (if D123534 gets merged), this can be updated ## to include a check that llvm-symbolizer can also symbolize constant strings, ## like `str` above (basically that &"12345678" should be symbolizable) ## to the specific line. Then, you can find the address of the constant string ## from the relocation: ## ## $ nm out.so | grep str ## 00000000000038c0 D str ## $ llvm-objdump -R out.so | grep 38c0 ## 00000000000038c0 R_X86_64_RELATIVE *ABS*+0x4f8 # <-- 0x4f8 ################################################################################ --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Machine: EM_AARCH64 ProgramHeaders: - Type: PT_PHDR Flags: [ PF_R ] VAddr: 0x40 Align: 0x8 - Type: PT_LOAD Flags: [ PF_R ] FirstSec: .dynsym LastSec: .eh_frame Align: 0x10000 - Type: PT_LOAD Flags: [ PF_X, PF_R ] FirstSec: .text LastSec: .text VAddr: 0x103E4 Align: 0x10000 - Type: PT_LOAD Flags: [ PF_W, PF_R ] FirstSec: .dynamic LastSec: .dynamic VAddr: 0x20410 Align: 0x10000 - Type: PT_LOAD Flags: [ PF_W, PF_R ] FirstSec: .data LastSec: .bss VAddr: 0x304C0 Align: 0x10000 - Type: PT_DYNAMIC Flags: [ PF_W, PF_R ] FirstSec: .dynamic LastSec: .dynamic VAddr: 0x20410 Align: 0x8 - Type: PT_GNU_RELRO Flags: [ PF_R ] FirstSec: .dynamic LastSec: .dynamic VAddr: 0x20410 - Type: PT_GNU_EH_FRAME Flags: [ PF_R ] FirstSec: .eh_frame_hdr LastSec: .eh_frame_hdr VAddr: 0x37C Align: 0x4 - Type: PT_GNU_STACK Flags: [ PF_W, PF_R ] Align: 0x0 Sections: - Name: .dynsym Type: SHT_DYNSYM Flags: [ SHF_ALLOC ] Address: 0x238 Link: .dynstr AddressAlign: 0x8 - Name: .gnu.hash Type: SHT_GNU_HASH Flags: [ SHF_ALLOC ] Address: 0x2C8 Link: .dynsym AddressAlign: 0x8 Header: SymNdx: 0x1 Shift2: 0x1A BloomFilter: [ 0x400188002180000C ] HashBuckets: [ 0x1 ] HashValues: [ 0xEE8502A, 0xEE85016, 0xC033991C, 0x61F7372E, 0xB88AB7F ] - Name: .hash Type: SHT_HASH Flags: [ SHF_ALLOC ] Address: 0x2F8 Link: .dynsym AddressAlign: 0x4 Bucket: [ 5, 0, 4, 0, 3, 0 ] Chain: [ 0, 0, 0, 1, 2, 0 ] - Name: .dynstr Type: SHT_STRTAB Flags: [ SHF_ALLOC ] Address: 0x330 AddressAlign: 0x1 - Name: .rela.dyn Type: SHT_RELA Flags: [ SHF_ALLOC ] Address: 0x358 Link: .dynsym AddressAlign: 0x8 Relocations: - Offset: 0x304C8 Type: R_AARCH64_RELATIVE Addend: 880 - Name: .rodata Type: SHT_PROGBITS Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ] Address: 0x370 AddressAlign: 0x1 EntSize: 0x1 Content: '313233343536373800' - Name: .eh_frame_hdr Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0x37C AddressAlign: 0x4 Content: 011B033B18000000020000006800010034000000740001004C000000 - Name: .eh_frame Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0x398 AddressAlign: 0x8 Content: 1400000000000000017A5200017C1E011B0C1F0000000000140000001C0000002C0001000C00000000000000000000001400000034000000200001001C000000000000000000000000000000 - Name: .text Type: SHT_PROGBITS Flags: [ SHF_ALLOC, SHF_EXECINSTR ] Address: 0x103E4 AddressAlign: 0x4 Content: 0001009000501391C0035FD60801009008611391E90308AA2A4540B85F0100710001899AC0035FD6 - Name: .dynamic Type: SHT_DYNAMIC Flags: [ SHF_WRITE, SHF_ALLOC ] Address: 0x20410 Link: .dynstr AddressAlign: 0x8 Entries: - Tag: DT_RELA Value: 0x358 - Tag: DT_RELASZ Value: 0x18 - Tag: DT_RELAENT Value: 0x18 - Tag: DT_RELACOUNT Value: 0x1 - Tag: DT_SYMTAB Value: 0x238 - Tag: DT_SYMENT Value: 0x18 - Tag: DT_STRTAB Value: 0x330 - Tag: DT_STRSZ Value: 0x28 - Tag: DT_GNU_HASH Value: 0x2C8 - Tag: DT_HASH Value: 0x2F8 - Tag: DT_NULL Value: 0x0 - Name: .data Type: SHT_PROGBITS Flags: [ SHF_WRITE, SHF_ALLOC ] Address: 0x304C0 AddressAlign: 0x8 Content: '02000000000000000000000000000000' - Name: .bss Type: SHT_NOBITS Flags: [ SHF_WRITE, SHF_ALLOC ] Address: 0x304D0 AddressAlign: 0x4 Size: 0x10 - Name: .debug_abbrev Type: SHT_PROGBITS AddressAlign: 0x1 Content: 011101252513050325721710171B25111B120673170000023400032549133F193A0B3B0B0218000003240003253E0B0B0B0000040F004913000005260049130000062E01111B120640187A196E2503253A0B3B0B49133F190000073400032549133A0B3B0B02180000083400032549133A0B3B0B02186E25000009050003253A0B3B0B4913000000 - Name: .debug_info Type: SHT_PROGBITS AddressAlign: 0x1 Content: AB0000000500010800000000010021000108000000000000000205280000000800000002032E000000000102A1000304050402052E000000000202A101020648000000000402A102044D00000005520000000307080106050C000000016F0D0E0007A500000007082E000000000802A1030008092E000000000D02A1040A080B2E000000000C04A10423040C06061C000000016F0F0E000EA50000000910000EAA00000000042E0000000311020100 - Name: .debug_str_offsets Type: SHT_PROGBITS AddressAlign: 0x1 Content: 4C00000005000000A2000000000000002C00000059000000280000001C00000072000000640000008C0000008700000069000000140000007B0000009C0000001A0000000E0000008500000076000000 - Name: .comment Type: SHT_PROGBITS Flags: [ SHF_MERGE, SHF_STRINGS ] AddressAlign: 0x1 EntSize: 0x1 Content: 4C696E6B65723A204C4C442031352E302E300000636C616E672076657273696F6E2031352E302E30202868747470733A2F2F6769746875622E636F6D2F6C6C766D2F6C6C766D2D70726F6A6563742E67697420306462616566363162353666306566306162306366333865613932666663316633356265653366662900 - Name: .debug_line Type: SHT_PROGBITS AddressAlign: 0x1 Content: 620000000500080037000000010101FB0E0D00010101010000000100000101011F010E00000003011F020F051E0100000000006C97BBE59F7DC6A9EA956633431DA63E0400000902E4030100000000001805030A140500BF05190A0105120608740204000101 - Name: .debug_line_str Type: SHT_PROGBITS Flags: [ SHF_MERGE, SHF_STRINGS ] AddressAlign: 0x1 EntSize: 0x1 Content: 2F746D702F66696C652E637070002F7573722F6C6F63616C2F676F6F676C652F686F6D652F6D69746368702F6C6C766D2D6275696C642F6F707400 Symbols: - Name: file.cpp Type: STT_FILE Index: SHN_ABS - Name: '$x.0' Section: .text Value: 0x103E4 - Name: _ZZ1fvE15function_global Type: STT_OBJECT Section: .bss Value: 0x304D4 Size: 0x4 - Name: '$d.1' Section: .bss Value: 0x304D0 - Name: '$d.2' Section: .data Value: 0x304C0 - Name: '$d.3' Section: .rodata Value: 0x370 - Name: '$d.4' Section: .debug_abbrev - Name: '$d.5' Section: .debug_info - Name: '$d.6' Section: .debug_str_offsets - Name: '$d.7' Section: .debug_str Value: 0xA2 - Name: '$d.8' Section: .debug_addr - Name: _ZL4beta Type: STT_OBJECT Section: .bss Value: 0x304D8 Size: 0x4 - Name: _ZL5alpha Type: STT_OBJECT Section: .bss Value: 0x304DC Size: 0x4 - Name: '$d.9' Section: .comment Value: 0x13 - Name: '$d.10' Section: .eh_frame Value: 0x398 - Name: '$d.11' Section: .debug_line - Name: '$d.12' Section: .debug_line_str Value: 0xE - Name: _DYNAMIC Section: .dynamic Value: 0x20410 Other: [ STV_HIDDEN ] - Name: _Z1fv Type: STT_FUNC Section: .text Binding: STB_GLOBAL Value: 0x103E4 Size: 0xC - Name: _Z1fb Type: STT_FUNC Section: .text Binding: STB_GLOBAL Value: 0x103F0 Size: 0x1C - Name: bss_global Type: STT_OBJECT Section: .bss Binding: STB_GLOBAL Value: 0x304D0 Size: 0x4 - Name: data_global Type: STT_OBJECT Section: .data Binding: STB_GLOBAL Value: 0x304C0 Size: 0x4 - Name: str Type: STT_OBJECT Section: .data Binding: STB_GLOBAL Value: 0x304C8 Size: 0x8 DynamicSymbols: - Name: _Z1fv Type: STT_FUNC Section: .text Binding: STB_GLOBAL Value: 0x103E4 Size: 0xC - Name: _Z1fb Type: STT_FUNC Section: .text Binding: STB_GLOBAL Value: 0x103F0 Size: 0x1C - Name: bss_global Type: STT_OBJECT Section: .bss Binding: STB_GLOBAL Value: 0x304D0 Size: 0x4 - Name: data_global Type: STT_OBJECT Section: .data Binding: STB_GLOBAL Value: 0x304C0 Size: 0x4 - Name: str Type: STT_OBJECT Section: .data Binding: STB_GLOBAL Value: 0x304C8 Size: 0x8 DWARF: debug_str: - '/tmp/file.cpp' - _Z1fb - alpha - f - data_global - int - '/usr/local/google/home/mitchp/llvm-build/opt' - bss_global - char - _ZL4beta - str - bool - _ZL5alpha - b - beta - function_global - _Z1fv - 'clang version 15.0.0 (https://github.com/llvm/llvm-project.git 0dbaef61b56f0ef0ab0cf38ea92ffc1f35bee3ff)' debug_addr: - Length: 0x3C Version: 0x5 AddressSize: 0x8 Entries: - Address: 0x304D0 - Address: 0x304C0 - Address: 0x304C8 - Address: 0x304D4 - Address: 0x304D8 - Address: 0x103E4 - Address: 0x103F0 ...