// 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