| # REQUIRES: mips |
| # Check R_MIPS_GOT16 relocation against weak symbols. |
| |
| # RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o |
| # RUN: ld.lld %t.o -shared -o %t1.so |
| # RUN: llvm-readobj -r -dt -dynamic-table -mips-plt-got %t1.so \ |
| # RUN: | FileCheck -check-prefixes=CHECK,NOSYM %s |
| # RUN: ld.lld %t.o -shared -Bsymbolic -o %t2.so |
| # RUN: llvm-readobj -r -dt -dynamic-table -mips-plt-got %t2.so \ |
| # RUN: | FileCheck -check-prefixes=CHECK,SYM %s |
| |
| # CHECK: Relocations [ |
| # CHECK-NEXT: ] |
| |
| # NOSYM: Symbol { |
| # NOSYM: Name: foo |
| # NOSYM-NEXT: Value: 0x20000 |
| # NOSYM-NEXT: Size: 0 |
| # NOSYM-NEXT: Binding: Weak |
| # NOSYM-NEXT: Type: None |
| # NOSYM-NEXT: Other: 0 |
| # NOSYM-NEXT: Section: .data |
| # NOSYM-NEXT: } |
| |
| # CHECK: Symbol { |
| # CHECK: Name: bar |
| # CHECK-NEXT: Value: 0x0 |
| # CHECK-NEXT: Size: 0 |
| # CHECK-NEXT: Binding: Weak |
| # CHECK-NEXT: Type: None |
| # CHECK-NEXT: Other: 0 |
| # CHECK-NEXT: Section: Undefined |
| # CHECK-NEXT: } |
| |
| # NOSYM: Symbol { |
| # NOSYM: Name: sym |
| # NOSYM-NEXT: Value: 0x20004 |
| # NOSYM-NEXT: Size: 0 |
| # NOSYM-NEXT: Binding: Global |
| # NOSYM-NEXT: Type: None |
| # NOSYM-NEXT: Other: 0 |
| # NOSYM-NEXT: Section: .data |
| # NOSYM-NEXT: } |
| |
| # CHECK: 0x70000011 MIPS_SYMTABNO 4 |
| |
| # SYM: 0x7000000A MIPS_LOCAL_GOTNO 4 |
| # SYM: 0x70000013 MIPS_GOTSYM 0x3 |
| |
| # NOSYM: 0x7000000A MIPS_LOCAL_GOTNO 2 |
| # NOSYM: 0x70000013 MIPS_GOTSYM 0x1 |
| |
| # CHECK: Primary GOT { |
| # CHECK-NEXT: Canonical gp value: |
| # CHECK-NEXT: Reserved entries [ |
| # CHECK: ] |
| |
| # SYM: Local entries [ |
| # SYM-NEXT: Entry { |
| # SYM-NEXT: Address: |
| # SYM-NEXT: Access: -32744 |
| # SYM-NEXT: Initial: 0x20000 |
| # SYM-NEXT: } |
| # SYM-NEXT: Entry { |
| # SYM-NEXT: Address: |
| # SYM-NEXT: Access: -32740 |
| # SYM-NEXT: Initial: 0x20004 |
| # SYM-NEXT: } |
| # SYM-NEXT: ] |
| |
| # NOSYM: Local entries [ |
| # NOSYM-NEXT: ] |
| |
| # SYM-NEXT: Global entries [ |
| # SYM-NEXT: Entry { |
| # SYM-NEXT: Address: |
| # SYM-NEXT: Access: -32736 |
| # SYM-NEXT: Initial: 0x0 |
| # SYM-NEXT: Value: 0x0 |
| # SYM-NEXT: Type: None |
| # SYM-NEXT: Section: Undefined |
| # SYM-NEXT: Name: bar |
| # SYM-NEXT: } |
| # SYM-NEXT: ] |
| |
| # NOSYM-NEXT: Global entries [ |
| # NOSYM-NEXT: Entry { |
| # NOSYM-NEXT: Address: |
| # NOSYM-NEXT: Access: -32744 |
| # NOSYM-NEXT: Initial: 0x20000 |
| # NOSYM-NEXT: Value: 0x20000 |
| # NOSYM-NEXT: Type: None |
| # NOSYM-NEXT: Section: .data |
| # NOSYM-NEXT: Name: foo |
| # NOSYM-NEXT: } |
| # NOSYM-NEXT: Entry { |
| # NOSYM-NEXT: Address: |
| # NOSYM-NEXT: Access: -32740 |
| # NOSYM-NEXT: Initial: 0x0 |
| # NOSYM-NEXT: Value: 0x0 |
| # NOSYM-NEXT: Type: None |
| # NOSYM-NEXT: Section: Undefined |
| # NOSYM-NEXT: Name: bar |
| # NOSYM-NEXT: } |
| # NOSYM-NEXT: Entry { |
| # NOSYM-NEXT: Address: |
| # NOSYM-NEXT: Access: -32736 |
| # NOSYM-NEXT: Initial: 0x20004 |
| # NOSYM-NEXT: Value: 0x20004 |
| # NOSYM-NEXT: Type: None |
| # NOSYM-NEXT: Section: .data |
| # NOSYM-NEXT: Name: sym |
| # NOSYM-NEXT: } |
| # NOSYM-NEXT: ] |
| |
| # CHECK: Number of TLS and multi-GOT entries: 0 |
| # CHECK-NEXT: } |
| |
| .text |
| .global sym |
| .weak foo,bar |
| func: |
| lw $t0,%got(foo)($gp) |
| lw $t0,%got(bar)($gp) |
| lw $t0,%got(sym)($gp) |
| |
| .data |
| .weak foo |
| foo: |
| .word 0 |
| sym: |
| .word 0 |