blob: e860bb482a2c102bf42dcab11de0f31f8735463b [file] [log] [blame]
# 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-prefix=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-prefix=SYM %s
# REQUIRES: mips
# NOSYM: Relocations [
# NOSYM-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: }
# NOSYM-NEXT: Symbol {
# NOSYM-NEXT: Name: bar
# NOSYM-NEXT: Value: 0x0
# NOSYM-NEXT: Size: 0
# NOSYM-NEXT: Binding: Weak
# NOSYM-NEXT: Type: None
# NOSYM-NEXT: Other: 0
# NOSYM-NEXT: Section: Undefined
# NOSYM-NEXT: }
# NOSYM-NEXT: Symbol {
# NOSYM-NEXT: 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: }
# NOSYM-NEXT: ]
# NOSYM: 0x70000011 MIPS_SYMTABNO 4
# NOSYM-NEXT: 0x7000000A MIPS_LOCAL_GOTNO 2
# NOSYM-NEXT: 0x70000013 MIPS_GOTSYM 0x1
# NOSYM: Primary GOT {
# NOSYM-NEXT: Canonical gp value:
# NOSYM-NEXT: Reserved entries [
# NOSYM-NEXT: Entry {
# NOSYM-NEXT: Address:
# NOSYM-NEXT: Access: -32752
# NOSYM-NEXT: Initial: 0x0
# NOSYM-NEXT: Purpose: Lazy resolver
# NOSYM-NEXT: }
# NOSYM-NEXT: Entry {
# NOSYM-NEXT: Address:
# NOSYM-NEXT: Access: -32748
# NOSYM-NEXT: Initial: 0x80000000
# NOSYM-NEXT: Purpose: Module pointer (GNU extension)
# NOSYM-NEXT: }
# NOSYM-NEXT: ]
# NOSYM-NEXT: Local entries [
# NOSYM-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: ]
# NOSYM-NEXT: Number of TLS and multi-GOT entries: 0
# NOSYM-NEXT: }
# SYM: Relocations [
# SYM-NEXT: ]
# SYM: Symbol {
# SYM: Name: bar
# SYM-NEXT: Value: 0x0
# SYM-NEXT: Size: 0
# SYM-NEXT: Binding: Weak
# SYM-NEXT: Type: None
# SYM-NEXT: Other: 0
# SYM-NEXT: Section: Undefined
# SYM-NEXT: }
# SYM-NEXT: ]
# SYM: 0x70000011 MIPS_SYMTABNO 4
# SYM-NEXT: 0x7000000A MIPS_LOCAL_GOTNO 4
# SYM-NEXT: 0x70000013 MIPS_GOTSYM 0x3
# SYM: Primary GOT {
# SYM-NEXT: Canonical gp value:
# SYM-NEXT: Reserved entries [
# SYM-NEXT: Entry {
# SYM-NEXT: Address:
# SYM-NEXT: Access: -32752
# SYM-NEXT: Initial: 0x0
# SYM-NEXT: Purpose: Lazy resolver
# SYM-NEXT: }
# SYM-NEXT: Entry {
# SYM-NEXT: Address:
# SYM-NEXT: Access: -32748
# SYM-NEXT: Initial: 0x80000000
# SYM-NEXT: Purpose: Module pointer (GNU extension)
# SYM-NEXT: }
# SYM-NEXT: ]
# SYM-NEXT: 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: ]
# 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: ]
# SYM-NEXT: Number of TLS and multi-GOT entries: 0
# SYM-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