1# RUN: ld64.lld -arch i386 -r -print_atoms %s -o %t | FileCheck %s \ 2# RUN: && ld64.lld -arch i386 -r -print_atoms %t -o %t2 | FileCheck %s 3# 4# Test parsing and writing of x86 relocations. 5# 6# The first step tests if the supplied mach-o file is parsed into the correct 7# set of references. The second step verifies relocations can be round-tripped 8# by writing to a new .o file, then parsing that file which should result in 9# the same references. 10# 11# .text 12#_test: 13# call _undef 14# call _undef+2 15# call _foo 16# call _foo+2 17# callw _undef 18# callw _foo 19# callw _foo+2 20#L1: 21# movl _undef, %eax 22# movl _x, %eax 23# movl _x+4, %eax 24# movl _x-L1(%eax), %eax 25# movl _x+4-L1(%eax), %eax 26# 27#_foo: 28# ret 29# 30# .data 31#_x: 32# .long _undef 33# .long _undef+7 34# .long _foo 35# .long _foo+3 36# .long _test - . 37# .long _test+3 - . 38# 39 40--- !mach-o 41arch: x86 42file-type: MH_OBJECT 43flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ] 44OS: unknown 45sections: 46 - segment: __TEXT 47 section: __text 48 type: S_REGULAR 49 attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ] 50 address: 0x0000000000000000 51 content: [ 0xE8, 0xFB, 0xFF, 0xFF, 0xFF, 0xE8, 0xF8, 0xFF, 52 0xFF, 0xFF, 0xE8, 0x2C, 0x00, 0x00, 0x00, 0xE8, 53 0x29, 0x00, 0x00, 0x00, 0x66, 0xE8, 0xE8, 0xFF, 54 0x66, 0xE8, 0x1F, 0x00, 0x66, 0xE8, 0x1D, 0x00, 55 0xA1, 0x00, 0x00, 0x00, 0x00, 0xA1, 0x3C, 0x00, 56 0x00, 0x00, 0xA1, 0x40, 0x00, 0x00, 0x00, 0x8B, 57 0x80, 0x1C, 0x00, 0x00, 0x00, 0x8B, 0x80, 0x20, 58 0x00, 0x00, 0x00, 0xC3 ] 59 relocations: 60 - offset: 0x00000037 61 scattered: true 62 type: GENERIC_RELOC_LOCAL_SECTDIFF 63 length: 2 64 pc-rel: false 65 value: 0x0000003C 66 - offset: 0x00000000 67 scattered: true 68 type: GENERIC_RELOC_PAIR 69 length: 2 70 pc-rel: false 71 value: 0x00000020 72 - offset: 0x00000031 73 scattered: true 74 type: GENERIC_RELOC_LOCAL_SECTDIFF 75 length: 2 76 pc-rel: false 77 value: 0x0000003C 78 - offset: 0x00000000 79 scattered: true 80 type: GENERIC_RELOC_PAIR 81 length: 2 82 pc-rel: false 83 value: 0x00000020 84 - offset: 0x0000002B 85 scattered: true 86 type: GENERIC_RELOC_VANILLA 87 length: 2 88 pc-rel: false 89 value: 0x0000003C 90 - offset: 0x00000026 91 type: GENERIC_RELOC_VANILLA 92 length: 2 93 pc-rel: false 94 extern: false 95 symbol: 2 96 - offset: 0x00000021 97 type: GENERIC_RELOC_VANILLA 98 length: 2 99 pc-rel: false 100 extern: true 101 symbol: 3 102 - offset: 0x0000001E 103 scattered: true 104 type: GENERIC_RELOC_VANILLA 105 length: 1 106 pc-rel: true 107 value: 0x0000003B 108 - offset: 0x0000001A 109 type: GENERIC_RELOC_VANILLA 110 length: 1 111 pc-rel: true 112 extern: false 113 symbol: 1 114 - offset: 0x00000016 115 type: GENERIC_RELOC_VANILLA 116 length: 1 117 pc-rel: true 118 extern: true 119 symbol: 3 120 - offset: 0x00000010 121 scattered: true 122 type: GENERIC_RELOC_VANILLA 123 length: 2 124 pc-rel: true 125 value: 0x0000003B 126 - offset: 0x0000000B 127 type: GENERIC_RELOC_VANILLA 128 length: 2 129 pc-rel: true 130 extern: false 131 symbol: 1 132 - offset: 0x00000006 133 type: GENERIC_RELOC_VANILLA 134 length: 2 135 pc-rel: true 136 extern: true 137 symbol: 3 138 - offset: 0x00000001 139 type: GENERIC_RELOC_VANILLA 140 length: 2 141 pc-rel: true 142 extern: true 143 symbol: 3 144 - segment: __DATA 145 section: __data 146 type: S_REGULAR 147 attributes: [ ] 148 address: 0x000000000000003C 149 content: [ 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 150 0x3B, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 151 0xB4, 0xFF, 0xFF, 0xFF, 0xB3, 0xFF, 0xFF, 0xFF ] 152 relocations: 153 - offset: 0x00000014 154 scattered: true 155 type: GENERIC_RELOC_LOCAL_SECTDIFF 156 length: 2 157 pc-rel: false 158 value: 0x00000000 159 - offset: 0x00000000 160 scattered: true 161 type: GENERIC_RELOC_PAIR 162 length: 2 163 pc-rel: false 164 value: 0x00000050 165 - offset: 0x00000010 166 scattered: true 167 type: GENERIC_RELOC_LOCAL_SECTDIFF 168 length: 2 169 pc-rel: false 170 value: 0x00000000 171 - offset: 0x00000000 172 scattered: true 173 type: GENERIC_RELOC_PAIR 174 length: 2 175 pc-rel: false 176 value: 0x0000004C 177 - offset: 0x0000000C 178 scattered: true 179 type: GENERIC_RELOC_VANILLA 180 length: 2 181 pc-rel: false 182 value: 0x0000003B 183 - offset: 0x00000008 184 type: GENERIC_RELOC_VANILLA 185 length: 2 186 pc-rel: false 187 extern: false 188 symbol: 1 189 - offset: 0x00000004 190 type: GENERIC_RELOC_VANILLA 191 length: 2 192 pc-rel: false 193 extern: true 194 symbol: 3 195 - offset: 0x00000000 196 type: GENERIC_RELOC_VANILLA 197 length: 2 198 pc-rel: false 199 extern: true 200 symbol: 3 201local-symbols: 202 - name: _test 203 type: N_SECT 204 sect: 1 205 value: 0x0000000000000000 206 - name: _foo 207 type: N_SECT 208 sect: 1 209 value: 0x000000000000003B 210 - name: _x 211 type: N_SECT 212 sect: 2 213 value: 0x000000000000003C 214undefined-symbols: 215 - name: _undef 216 type: N_UNDF 217 scope: [ N_EXT ] 218 value: 0x0000000000000000 219... 220 221# CHECK: defined-atoms: 222# CHECK: - name: _x 223# CHECK: type: data 224# CHECK: references: 225# CHECK: - kind: pointer32 226# CHECK: offset: 0 227# CHECK: target: _undef 228# CHECK-NOT: addend: 229# CHECK: - kind: pointer32 230# CHECK: offset: 4 231# CHECK: target: _undef 232# CHECK: addend: 7 233# CHECK: - kind: pointer32 234# CHECK: offset: 8 235# CHECK: target: _foo 236# CHECK-NOT: addend: 237# CHECK: - kind: pointer32 238# CHECK: offset: 12 239# CHECK: target: _foo 240# CHECK: addend: 3 241# CHECK: - kind: delta32 242# CHECK: offset: 16 243# CHECK: target: _test 244# CHECK: - kind: delta32 245# CHECK: offset: 20 246# CHECK: target: _test 247# CHECK: addend: 3 248# CHECK: - name: _test 249# CHECK: references: 250# CHECK: - kind: branch32 251# CHECK: offset: 1 252# CHECK: target: _undef 253# CHECK-NOT: addend: 254# CHECK: - kind: branch32 255# CHECK: offset: 6 256# CHECK: target: _undef 257# CHECK: addend: 2 258# CHECK: - kind: branch32 259# CHECK: offset: 11 260# CHECK: target: _foo 261# CHECK-NOT: addend: 262# CHECK: - kind: branch32 263# CHECK: offset: 16 264# CHECK: target: _foo 265# CHECK: addend: 2 266# CHECK: - kind: branch16 267# CHECK: offset: 22 268# CHECK: target: _undef 269# CHECK-NOT: addend: 270# CHECK: - kind: branch16 271# CHECK: offset: 26 272# CHECK: target: _foo 273# CHECK-NOT: addend: 274# CHECK: - kind: branch16 275# CHECK: offset: 30 276# CHECK: target: _foo 277# CHECK: addend: 2 278# CHECK: - kind: abs32 279# CHECK: offset: 33 280# CHECK: target: _undef 281# CHECK: - kind: abs32 282# CHECK: offset: 38 283# CHECK: target: _x 284# CHECK: - kind: abs32 285# CHECK: offset: 43 286# CHECK: target: _x 287# CHECK: addend: 4 288# CHECK: - kind: funcRel32 289# CHECK: offset: 49 290# CHECK: target: _x 291# CHECK: addend: -32 292# CHECK: - kind: funcRel32 293# CHECK: offset: 55 294# CHECK: target: _x 295# CHECK: addend: -28 296 297