| // 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 --no-show-raw-insn --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: 0x30128 |
| // 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: 0x4012C |
| // 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-EMPTY: |
| // CODE-NEXT: <_start>: |
| // CODE-NEXT: 20114: ldr r0, [pc, #8] |
| // CODE-NEXT: 20118: ldr r0, [pc, r0] |
| // CODE-NEXT: 2011c: ldr r0, [r0] |
| // CODE-NEXT: 20120: bx lr |
| // CODE: <$d.1>: |
| // 0x11124 + 0x1008 + 8 = 0x12128 = .got |
| // CODE-NEXT: 20124: 08 00 01 00 |