| # RUN: ld64.lld -arch x86_64 -r -print_atoms %s -o %t | FileCheck %s \ |
| # RUN: && ld64.lld -arch x86_64 -r -print_atoms %t -o %t2 | FileCheck %s |
| # |
| # Test parsing and writing of x86_64 text 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: |
| # call _foo |
| # call _foo+4 |
| # movq _foo@GOTPCREL(%rip), %rax |
| # pushq _foo@GOTPCREL(%rip) |
| # movl _foo(%rip), %eax |
| # movl _foo+4(%rip), %eax |
| # movb $0x12, _foo(%rip) |
| # movw $0x1234, _foo(%rip) |
| # movl $0x12345678, _foo(%rip) |
| # movl L2(%rip), %eax |
| # movb $0x12, L2(%rip) |
| # movw $0x1234, L2(%rip) |
| # movl $0x12345678, L2(%rip) |
| # |
| # .data |
| #L2: .long 0 |
| |
| |
| --- !mach-o |
| arch: x86_64 |
| file-type: MH_OBJECT |
| flags: [ ] |
| sections: |
| - segment: __TEXT |
| section: __text |
| type: S_REGULAR |
| attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ] |
| address: 0x0000000000000000 |
| content: [ 0xE8, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x04, 0x00, |
| 0x00, 0x00, 0x48, 0x8B, 0x05, 0x04, 0x00, 0x00, |
| 0x00, 0xFF, 0x35, 0x04, 0x00, 0x00, 0x00, 0x8B, |
| 0x05, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x05, 0x04, |
| 0x00, 0x00, 0x00, 0xC6, 0x05, 0xFF, 0xFF, 0xFF, |
| 0xFF, 0x12, 0x66, 0xC7, 0x05, 0xFE, 0xFF, 0xFF, |
| 0xFF, 0x34, 0x12, 0xC7, 0x05, 0xFC, 0xFF, 0xFF, |
| 0xFF, 0x78, 0x56, 0x34, 0x12, 0x8B, 0x05, 0x1A, |
| 0x00, 0x00, 0x00, 0xc6, 0x05, 0x13, 0x00, 0x00, |
| 0x00, 0x12, 0x66, 0xc7, 0x05, 0x0a, 0x00, 0x00, |
| 0x00, 0x34, 0x12, 0xc7, 0x05, 0x00, 0x00, 0x00, |
| 0x00, 0x78, 0x56, 0x34, 0x12 ] |
| relocations: |
| - offset: 0x00000055 |
| type: X86_64_RELOC_SIGNED_4 |
| length: 2 |
| pc-rel: true |
| extern: false |
| symbol: 2 |
| - offset: 0x0000004d |
| type: X86_64_RELOC_SIGNED_2 |
| length: 2 |
| pc-rel: true |
| extern: false |
| symbol: 2 |
| - offset: 0x00000045 |
| type: X86_64_RELOC_SIGNED_1 |
| length: 2 |
| pc-rel: true |
| extern: false |
| symbol: 2 |
| - offset: 0x0000003F |
| type: X86_64_RELOC_SIGNED |
| length: 2 |
| pc-rel: true |
| extern: false |
| symbol: 2 |
| - offset: 0x00000035 |
| type: X86_64_RELOC_SIGNED_4 |
| length: 2 |
| pc-rel: true |
| extern: true |
| symbol: 1 |
| - offset: 0x0000002D |
| type: X86_64_RELOC_SIGNED_2 |
| length: 2 |
| pc-rel: true |
| extern: true |
| symbol: 1 |
| - offset: 0x00000025 |
| type: X86_64_RELOC_SIGNED_1 |
| length: 2 |
| pc-rel: true |
| extern: true |
| symbol: 1 |
| - offset: 0x0000001F |
| type: X86_64_RELOC_SIGNED |
| length: 2 |
| pc-rel: true |
| extern: true |
| symbol: 1 |
| - offset: 0x00000019 |
| type: X86_64_RELOC_SIGNED |
| length: 2 |
| pc-rel: true |
| extern: true |
| symbol: 1 |
| - offset: 0x00000013 |
| type: X86_64_RELOC_GOT |
| length: 2 |
| pc-rel: true |
| extern: true |
| symbol: 1 |
| - offset: 0x0000000D |
| type: X86_64_RELOC_GOT_LOAD |
| length: 2 |
| pc-rel: true |
| extern: true |
| symbol: 1 |
| - offset: 0x00000006 |
| type: X86_64_RELOC_BRANCH |
| length: 2 |
| pc-rel: true |
| extern: true |
| symbol: 1 |
| - offset: 0x00000001 |
| type: X86_64_RELOC_BRANCH |
| length: 2 |
| pc-rel: true |
| extern: true |
| symbol: 1 |
| - segment: __DATA |
| section: __data |
| type: S_REGULAR |
| attributes: [ ] |
| address: 0x000000000000005D |
| content: [ 0x00, 0x00, 0x00, 0x00 ] |
| local-symbols: |
| - name: _test |
| type: N_SECT |
| sect: 1 |
| value: 0x0000000000000000 |
| undefined-symbols: |
| - name: _foo |
| type: N_UNDF |
| scope: [ N_EXT ] |
| value: 0x0000000000000000 |
| ... |
| |
| # CHECK: defined-atoms: |
| # CHECK: - ref-name: [[LABEL:L[0-9]+]] |
| # CHECK: type: data |
| # CHECK: content: [ 00, 00, 00, 00 ] |
| # CHECK: - name: _test |
| # CHECK: references: |
| # CHECK: - kind: branch32 |
| # CHECK: offset: 1 |
| # CHECK: target: _foo |
| # CHECK: - kind: branch32 |
| # CHECK: offset: 6 |
| # CHECK: target: _foo |
| # CHECK: addend: 4 |
| # CHECK: - kind: ripRel32GotLoad |
| # CHECK: offset: 13 |
| # CHECK: target: _foo |
| # CHECK: addend: 4 |
| # CHECK: - kind: ripRel32Got |
| # CHECK: offset: 19 |
| # CHECK: target: _foo |
| # CHECK: addend: 4 |
| # CHECK: - kind: ripRel32 |
| # CHECK: offset: 25 |
| # CHECK: target: _foo |
| # CHECK: - kind: ripRel32 |
| # CHECK: offset: 31 |
| # CHECK: target: _foo |
| # CHECK: addend: 4 |
| # CHECK: - kind: ripRel32Minus1 |
| # CHECK: offset: 37 |
| # CHECK: target: _foo |
| # CHECK-NOT: addend: |
| # CHECK: - kind: ripRel32Minus2 |
| # CHECK: offset: 45 |
| # CHECK: target: _foo |
| # CHECK-NOT: addend: |
| # CHECK: - kind: ripRel32Minus4 |
| # CHECK: offset: 53 |
| # CHECK: target: _foo |
| # CHECK-NOT: addend: |
| # CHECK: - kind: ripRel32Anon |
| # CHECK: offset: 63 |
| # CHECK: target: [[LABEL]] |
| # CHECK-NOT: addend: |
| # CHECK: - kind: ripRel32Minus1Anon |
| # CHECK: offset: 69 |
| # CHECK: target: [[LABEL]] |
| # CHECK-NOT: addend: |
| # CHECK: - kind: ripRel32Minus2Anon |
| # CHECK: offset: 77 |
| # CHECK: target: [[LABEL]] |
| # CHECK-NOT: addend: |
| # CHECK: - kind: ripRel32Minus4Anon |
| # CHECK: offset: 85 |
| # CHECK: target: [[LABEL]] |
| # CHECK-NOT: addend: |