# RUN: ld64.lld -arch arm64 -r -print_atoms %s -o %t | FileCheck %s # RUN: ld64.lld -arch arm64 -r -print_atoms %t -o %t2 | FileCheck %s # # Test parsing and writing of arm64 data relocations. # # The first step tests if the supplied mach-o file is parsed into the correct # set of references. The second step verifies relocations can be round-tripped # by writing to a new .o file, then parsing that file which should result in # the same references. # #_test: --- !mach-o arch: arm64 file-type: MH_OBJECT flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ] sections: - segment: __TEXT section: __text type: S_REGULAR attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ] alignment: 4 address: 0x0000000000000000 content: [ 0xC0, 0x03, 0x5F, 0xD6 ] - segment: __DATA section: __data type: S_REGULAR attributes: [ ] address: 0x0000000000000004 content: [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xBE, 0xFF, 0xFF, 0xFF, 0xB0, 0xFF, 0xFF, 0xFF ] relocations: - offset: 0x00000050 type: ARM64_RELOC_POINTER_TO_GOT length: 2 pc-rel: true extern: true symbol: 2 - offset: 0x0000004C type: ARM64_RELOC_SUBTRACTOR length: 2 pc-rel: false extern: true symbol: 2 - offset: 0x0000004C type: ARM64_RELOC_UNSIGNED length: 2 pc-rel: false extern: true symbol: 2 - offset: 0x00000048 type: ARM64_RELOC_SUBTRACTOR length: 2 pc-rel: false extern: true symbol: 2 - offset: 0x00000048 type: ARM64_RELOC_UNSIGNED length: 2 pc-rel: false extern: true symbol: 2 - offset: 0x00000040 type: ARM64_RELOC_UNSIGNED length: 3 pc-rel: false extern: true symbol: 2 - offset: 0x00000038 type: ARM64_RELOC_UNSIGNED length: 3 pc-rel: false extern: false symbol: 2 - offset: 0x00000030 type: ARM64_RELOC_SUBTRACTOR length: 3 pc-rel: false extern: true symbol: 2 - offset: 0x00000030 type: ARM64_RELOC_UNSIGNED length: 3 pc-rel: false extern: true symbol: 2 - offset: 0x00000028 type: ARM64_RELOC_SUBTRACTOR length: 3 pc-rel: false extern: true symbol: 2 - offset: 0x00000028 type: ARM64_RELOC_UNSIGNED length: 3 pc-rel: false extern: true symbol: 2 - offset: 0x00000020 type: ARM64_RELOC_SUBTRACTOR length: 3 pc-rel: false extern: true symbol: 2 - offset: 0x00000020 type: ARM64_RELOC_UNSIGNED length: 3 pc-rel: false extern: true symbol: 2 - offset: 0x00000018 type: ARM64_RELOC_POINTER_TO_GOT length: 3 pc-rel: false extern: true symbol: 2 - offset: 0x00000010 type: ARM64_RELOC_UNSIGNED length: 3 pc-rel: false extern: true symbol: 2 - offset: 0x00000008 type: ARM64_RELOC_UNSIGNED length: 3 pc-rel: false extern: true symbol: 2 local-symbols: - name: _v1 type: N_SECT sect: 2 value: 0x000000000000000C global-symbols: - name: _bar type: N_SECT scope: [ N_EXT ] sect: 1 value: 0x0000000000000000 undefined-symbols: - name: _foo type: N_UNDF scope: [ N_EXT ] value: 0x0000000000000000 page-size: 0x00000000 ... # CHECK: defined-atoms: # CHECK: - ref-name: L000 # CHECK: type: data # CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ] # CHECK: - name: _v1 # CHECK: type: data # CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00, 08, 00, 00, 00, # CHECK: 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, # CHECK: 00, 00, 00, 00, 00, 00, 00, 00, E0, FF, FF, FF, # CHECK: FF, FF, FF, FF, DC, FF, FF, FF, FF, FF, FF, FF, # CHECK: {{..}}, {{..}}, 00, 00, 00, 00, 00, 00, 04, 00, 00, 00, # CHECK: 00, 00, 00, 00, C0, FF, FF, FF, BE, FF, FF, FF, # CHECK: {{B0|B8}}, {{..}}, FF, FF ] # CHECK: references: # CHECK: - kind: pointer64 # CHECK: offset: 0 # CHECK: target: _foo # CHECK-NOT: addend: # CHECK: - kind: pointer64 # CHECK: offset: 8 # CHECK: target: _foo # CHECK: addend: 8 # CHECK: - kind: pointer64ToGOT # CHECK: offset: 16 # CHECK: target: _foo # CHECK-NOT: addend: # CHECK: - kind: delta64 # CHECK: offset: 24 # CHECK: target: _foo # CHECK: addend: 24 # CHECK: - kind: delta64 # CHECK: offset: 32 # CHECK: target: _foo # CHECK-NOT: addend: # CHECK: - kind: delta64 # CHECK: offset: 40 # CHECK: target: _foo # CHECK: addend: 4 # CHECK: - kind: pointer64 # CHECK: offset: 48 # CHECK: target: L000 # CHECK-NOT: addend: # CHECK: - kind: pointer64 # CHECK: offset: 56 # CHECK: target: _foo # CHECK: addend: 4 # CHECK: - kind: delta32 # CHECK: offset: 64 # CHECK: target: _foo # CHECK-NOT: addend: # CHECK: - kind: delta32 # CHECK: offset: 68 # CHECK: target: _foo # CHECK: addend: 2 # CHECK: - kind: delta32ToGOT # CHECK: offset: 72 # CHECK: target: _foo # CHECK-NOT: addend: # CHECK: - name: _bar # CHECK: scope: global # CHECK: content: [ C0, 03, 5F, D6 ] # CHECK: alignment: 4 # CHECK: undefined-atoms: # CHECK: - name: _foo # .subsections_via_symbols # .text # .globl_foo # .align2 # _foo: # ret # .data #Lanon: # .quad 0 #_v1: # .quad _foo # .quad _foo + 8 # .quad _foo@GOT # .quad _foo + 24 - . # .quad _foo - . # .quad _foo + 4 - . # .quad Lanon # .quad Lanon + 4 # .long _foo - . # .long _foo +2 - . # .long _foo@GOT - .