# 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 # RUN: llvm-objdump -r -s -section="__eh_frame" -macho %t | FileCheck -check-prefix=CODE %s # RUN: llvm-objdump -r -s -section="__eh_frame" -macho %t2 | FileCheck -check-prefix=CODE %s --- !mach-o arch: arm64 file-type: MH_OBJECT flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ] compat-version: 0.0 current-version: 0.0 has-UUID: false OS: unknown sections: - segment: __TEXT section: __text type: S_REGULAR attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ] alignment: 4 address: 0x0000000000000000 content: [ 0xFD, 0x7B, 0xBF, 0xA9, 0xFD, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x80, 0x52, 0xFD, 0x7B, 0xC1, 0xA8, 0xC0, 0x03, 0x5F, 0xD6 ] relocations: - offset: 0x00000010 type: ARM64_RELOC_BRANCH26 length: 2 pc-rel: true extern: true symbol: 9 - offset: 0x0000000C type: ARM64_RELOC_PAGEOFF12 length: 2 pc-rel: false extern: true symbol: 1 - offset: 0x00000008 type: ARM64_RELOC_PAGE21 length: 2 pc-rel: true extern: true symbol: 1 - segment: __TEXT section: __cstring type: S_CSTRING_LITERALS attributes: [ ] address: 0x0000000000000020 content: [ 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x00 ] - segment: __LD section: __compact_unwind type: S_REGULAR attributes: [ ] alignment: 8 address: 0x0000000000000030 content: [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] relocations: - offset: 0x00000000 type: ARM64_RELOC_UNSIGNED length: 3 pc-rel: false extern: false symbol: 1 - segment: __TEXT section: __eh_frame type: S_COALESCED attributes: [ ] alignment: 8 address: 0x0000000000000050 content: [ 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7A, 0x50, 0x4C, 0x52, 0x00, 0x01, 0x78, 0x1E, 0x07, 0x00, 0x9D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x10, 0x0C, 0x1F, 0x00, 0x24, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x88, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x0E, 0x10, 0x9E, 0x01, 0x9D, 0x02 ] - segment: __TEXT section: __gcc_except_tab type: S_REGULAR attributes: [ ] address: 0x00000000000000A0 content: [ 0x00, 0x00, 0x00, 0x00 ] local-symbols: - name: ltmp0 type: N_SECT sect: 1 value: 0x0000000000000000 - name: L_str type: N_SECT sect: 2 value: 0x0000000000000020 - name: ltmp1 type: N_SECT sect: 2 value: 0x0000000000000020 - name: ltmp2 type: N_SECT sect: 3 value: 0x0000000000000030 - name: ltmp3 type: N_SECT sect: 4 value: 0x0000000000000050 - name: ltmp4 type: N_SECT sect: 4 value: 0x0000000000000070 global-symbols: - name: __Z3fooi type: N_SECT scope: [ N_EXT ] sect: 1 value: 0x0000000000000000 undefined-symbols: - name: __gxx_personality_v0 type: N_UNDF scope: [ N_EXT ] value: 0x0000000000000000 - name: _bar type: N_UNDF scope: [ N_EXT ] value: 0x0000000000000000 - name: _puts type: N_UNDF scope: [ N_EXT ] value: 0x0000000000000000 page-size: 0x00000000 # CHECK: defined-atoms: # CHECK: - ref-name: L{{[0-9]*}} # CHECK: scope: hidden # CHECK: type: c-string # CHECK: content: [ 48, 65, 6C, 6C, 6F, 20, 77, 6F, 72, 6C, 64, 00 ] # CHECK: merge: by-content # CHECK: - ref-name: L{{[0-9]*}} # CHECK: type: unwind-cfi # CHECK: content: [ 1C, 00, 00, 00, 00, 00, 00, 00, 01, 7A, 50, 4C, # CHECK: 52, 00, 01, 78, 1E, 07, 00, {{..}}, {{..}}, {{..}}, {{..}}, {{..}}, # CHECK: {{..}}, {{..}}, {{..}}, 00, 10, 0C, 1F, 00 ] # CHECK: - type: unwind-cfi # CHECK: content: [ 24, 00, 00, 00, 24, 00, 00, 00, {{..}}, {{..}}, {{..}}, {{..}}, # CHECK: {{..}}, {{..}}, {{..}}, {{..}}, 20, 00, 00, 00, 00, 00, 00, 00, # CHECK: 08, {{..}}, {{..}}, {{..}}, {{..}}, {{..}}, {{..}}, {{..}}, {{..}}, 48, 0E, 10, # CHECK: 9E, 01, 9D, 02 ] # CHECK: references: # CHECK: - kind: negDelta32 # CHECK: offset: 4 # CHECK: target: L{{[0-9]*}} # CHECK: - kind: unwindFDEToFunction # CHECK: offset: 8 # CHECK: target: __Z3fooi # CHECK: - kind: unwindFDEToFunction # CHECK: offset: 25 # CHECK: target: L{{[0-9]*}} # CHECK: - ref-name: L{{[0-9]*}} # CHECK: type: unwind-lsda # CHECK: content: [ 00, 00, 00, 00 ] # CHECK: - type: compact-unwind # CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00, 20, 00, 00, 00, # CHECK: 00, 00, 00, 03, 00, 00, 00, 00, 00, 00, 00, 00, # CHECK: 00, 00, 00, 00, 00, 00, 00, 00 ] # CHECK: alignment: 8 # CHECK: references: # CHECK: - kind: pointer64 # CHECK: offset: 0 # CHECK: target: __Z3fooi # CHECK: - name: __Z3fooi # CHECK: scope: global # CHECK: content: [ FD, 7B, BF, A9, FD, 03, 00, 91, 00, 00, 00, 90, # CHECK: 00, 00, 00, 91, 00, 00, 00, 94, 00, 00, 80, 52, # CHECK: FD, 7B, C1, A8, C0, 03, 5F, D6 ] # CHECK: alignment: 4 # CHECK: references: # CHECK: - kind: page21 # CHECK: offset: 8 # CHECK: target: L{{[0-9]*}} # CHECK: - kind: offset12 # CHECK: offset: 12 # CHECK: target: L{{[0-9]*}} # CHECK: - kind: branch26 # CHECK: offset: 16 # CHECK: target: _puts # Make sure we don't have any relocations in the __eh_frame section # CODE-NOT: RELOCATION RECORDS FOR [__eh_frame] # Also make sure the reloc for the FDE->function is the correct offset # It should be the offset from the fixup location back to the address # of the function we are referencing # CODE: Contents of section __eh_frame: # This is the CIE: # CODE-NEXT: {{[0-9abcdef]*}} 1c000000 00000000 017a504c 52000178 # CODE-NEXT: {{[0-9abcdef]*}} 1e0700bd ffffffff ffffff00 100c1f00 # This is the FDE: # CODE-NEXT: {{[0-9abcdef]*}} 24000000 24000000 a8ffffff ffffffff # This is the important offset for FDE->func ^~~~~~~~ ~~~~~~~~ # CODE-NEXT: {{[0-9abcdef]*}} 20000000 00000000 08c3ffff ffffffff # And this is the offset for FDE->lsda ^~~~~~~~ ~~~~~~ # CODE-NEXT: {{[0-9abcdef]*}} ff480e10 9e019d02 # And this byte ^~