# RUN: llvm-mc -filetype=obj -triple x86_64 %s -o %t # RUN: llvm-objdump -dr %t | FileCheck %s # RUN: llvm-readelf -s %t | FileCheck %s --check-prefix=SYM # RUN: not llvm-mc -filetype=obj -triple x86_64 --defsym ERR=1 %s 2>&1 | FileCheck %s --check-prefix=ERR ## If a fixup symbol is equated to an undefined symbol, convert the fixup ## to be against the target symbol, even if there is a variant (@PLT). # CHECK: callq {{.*}} # CHECK-NEXT: R_X86_64_PLT32 __GI_memcpy-0x4 # CHECK: movabsq $0, %rax # CHECK-NEXT: R_X86_64_64 __GI_memcpy+0x2 memcpy = __GI_memcpy call memcpy@PLT movabsq $memcpy+2, %rax # CHECK: movq (%rip), %rax # CHECK-NEXT: R_X86_64_REX_GOTPCRELX abs-0x4 movq abs@GOTPCREL(%rip), %rax abs = 42 # CHECK: movabsq $0, %rbx # CHECK-NEXT: R_X86_64_64 data_alias .globl data_alias .set data_alias, data movabsq $data_alias, %rbx ## A local alias to a defined symbol still references a section symbol. # CHECK: movabsq $0, %rbx # CHECK-NEXT: R_X86_64_64 .data+0x1 .set data_alias_l, data movabsq $data_alias_l, %rbx .data .byte 0 .globl data data: .ifdef ERR .text ## Note, GNU as emits a relocation for this erroneous fixup. # ERR: {{.*}}.s:[[#@LINE+2]]:1: error: expected relocatable expression memcpy_plus_1 = __GI_memcpy+1 call memcpy_plus_1@PLT .endif ## Redirected symbols do not have a symbol table entry. # SYM: NOTYPE LOCAL DEFAULT UND # SYM-NEXT: NOTYPE LOCAL DEFAULT ABS abs # SYM-NEXT: NOTYPE LOCAL DEFAULT 4 data_alias_l # SYM-NEXT: SECTION LOCAL DEFAULT 4 .data # SYM-NEXT: NOTYPE GLOBAL DEFAULT UND __GI_memcpy # SYM-NEXT: NOTYPE GLOBAL DEFAULT 4 data # SYM-NEXT: NOTYPE GLOBAL DEFAULT 4 data_alias # SYM-NOT: {{.}}