| // REQUIRES: arm |
| // RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t.o |
| // RUN: ld.lld %t.o -o %t |
| // RUN: llvm-readobj -s %t | FileCheck %s |
| // RUN: llvm-readobj -s -symbols %t | FileCheck -check-prefix=SYMBOLS %s |
| // RUN: llvm-objdump -d -triple=armv7a-none-linux-gnueabi %t | FileCheck -check-prefix=CODE %s |
| |
| // Test the R_ARM_GOT_PREL relocation |
| .syntax unified |
| .text |
| .globl _start |
| .align 2 |
| _start: |
| ldr r0, .LCPI0_0 |
| .LPC0_0: |
| ldr r0, [pc, r0] |
| ldr r0, [r0] |
| bx lr |
| .LCPI0_0: |
| .Ltmp0: |
| // Generate R_ARM_GOT_PREL |
| .long val(GOT_PREL)-((.LPC0_0+8)-.Ltmp0) |
| |
| .data |
| .type val,%object |
| .globl val |
| .align 2 |
| val: |
| .long 10 |
| .size val, 4 |
| |
| // CHECK: Section { |
| // CHECK: Name: .got |
| // CHECK-NEXT: Type: SHT_PROGBITS |
| // CHECK-NEXT: Flags [ |
| // CHECK-NEXT: SHF_ALLOC |
| // CHECK-NEXT: SHF_WRITE |
| // CHECK-NEXT: ] |
| // CHECK-NEXT: Address: 0x13000 |
| // CHECK-NEXT: Offset: |
| // CHECK-NEXT: Size: 4 |
| // CHECK-NEXT: Link: |
| // CHECK-NEXT: Info: |
| // CHECK-NEXT: AddressAlignment: 4 |
| // CHECK-NEXT: EntrySize: |
| |
| // SYMBOLS: Name: val |
| // SYMBOLS-NEXT: Value: 0x12000 |
| // SYMBOLS-NEXT: Size: 4 |
| // SYMBOLS-NEXT: Binding: Global |
| // SYMBOLS-NEXT: Type: Object |
| // SYMBOLS-NEXT: Other: |
| // SYMBOLS-NEXT: Section: .data |
| |
| // CODE: Disassembly of section .text: |
| // CODE-NEXT: _start: |
| // CODE-NEXT: 11000: 08 00 9f e5 ldr r0, [pc, #8] |
| // CODE-NEXT: 11004: 00 00 9f e7 ldr r0, [pc, r0] |
| // CODE-NEXT: 11008: 00 00 90 e5 ldr r0, [r0] |
| // CODE-NEXT: 1100c: 1e ff 2f e1 bx lr |
| // CODE: $d.1: |
| // 0x11004 + 0x1ff4 + 8 = 0x13000 = .got |
| // CODE-NEXT: 11010: f4 1f 00 00 |