| # REQUIRES: mips |
| |
| # If there are two relocations such that the first one requires |
| # dynamic COPY relocation, the second one requires GOT entry |
| # creation, linker should create both - dynamic relocation |
| # and GOT entry. |
| |
| # RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux \ |
| # RUN: %S/Inputs/mips-dynamic.s -o %t.so.o |
| # RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o |
| # RUN: ld.lld %t.so.o -shared -o %t.so |
| # RUN: ld.lld %t.o %t.so -o %t.exe |
| # RUN: llvm-readobj -r -mips-plt-got %t.exe | FileCheck %s |
| |
| # CHECK: Relocations [ |
| # CHECK-NEXT: Section (7) .rel.dyn { |
| # CHECK-NEXT: 0x[[DATA0:[0-9A-F]+]] R_MIPS_COPY data0 |
| # CHECK-NEXT: 0x[[DATA1:[0-9A-F]+]] R_MIPS_COPY data1 |
| # CHECK-NEXT: } |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Primary GOT { |
| # CHECK-NEXT: Canonical gp value: |
| # CHECK-NEXT: Reserved entries [ |
| # CHECK: ] |
| # CHECK-NEXT: Local entries [ |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Global entries [ |
| # CHECK-NEXT: Entry { |
| # CHECK-NEXT: Address: |
| # CHECK-NEXT: Access: -32744 |
| # CHECK-NEXT: Initial: 0x[[DATA0]] |
| # CHECK-NEXT: Value: 0x[[DATA0]] |
| # CHECK-NEXT: Type: Object |
| # CHECK-NEXT: Section: .bss |
| # CHECK-NEXT: Name: data0@ |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Entry { |
| # CHECK-NEXT: Address: |
| # CHECK-NEXT: Access: -32740 |
| # CHECK-NEXT: Initial: 0x[[DATA1]] |
| # CHECK-NEXT: Value: 0x[[DATA1]] |
| # CHECK-NEXT: Type: Object |
| # CHECK-NEXT: Section: .bss |
| # CHECK-NEXT: Name: data1@ |
| # CHECK-NEXT: } |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Number of TLS and multi-GOT entries: 0 |
| # CHECK-NEXT: } |
| |
| .text |
| .global __start |
| __start: |
| # Case A: 'got' relocation goes before 'copy' relocation |
| lui $t0,%hi(data0) # R_MIPS_HI16 - requires R_MISP_COPY relocation |
| addi $t0,$t0,%lo(data0) |
| lw $t0,%got(data0)($gp) # R_MIPS_GOT16 - requires GOT entry |
| |
| # Case B: 'copy' relocation goes before 'got' relocation |
| lw $t0,%got(data1)($gp) # R_MIPS_GOT16 - requires GOT entry |
| lui $t0,%hi(data1) # R_MIPS_HI16 - requires R_MISP_COPY relocation |
| addi $t0,$t0,%lo(data1) |