| ... | ... | @@ -56,8 +56,9 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 56 | 56 | \\ .weak _DYNAMIC |
| 57 | 57 | \\ .hidden _DYNAMIC |
| 58 | 58 | \\ call 1f |
| 59 | | \\ 1: pop %[ret] |
| 60 | | \\ lea _DYNAMIC-1b(%[ret]), %[ret] |
| 59 | \\1: |
| 60 | \\ pop %[ret] |
| 61 | \\ lea _DYNAMIC - 1b(%[ret]), %[ret] |
| 61 | 62 | : [ret] "=r" (-> [*]const elf.Dyn), |
| 62 | 63 | ), |
| 63 | 64 | .x86_64 => asm volatile ( |
| ... | ... | @@ -79,8 +80,9 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 79 | 80 | \\ ldr %[ret], 1f |
| 80 | 81 | \\ add %[ret], pc |
| 81 | 82 | \\ b 2f |
| 82 | | \\ 1: .word _DYNAMIC-1b |
| 83 | | \\ 2: |
| 83 | \\1: |
| 84 | \\ .word _DYNAMIC-1b |
| 85 | \\2: |
| 84 | 86 | : [ret] "=r" (-> [*]const elf.Dyn), |
| 85 | 87 | ), |
| 86 | 88 | // A simple `adr` is not enough as it has a limited offset range |
| ... | ... | @@ -99,7 +101,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 99 | 101 | \\ ldq %[ret], -0x8000($29) |
| 100 | 102 | : [ret] "=r" (-> [*]const elf.Dyn), |
| 101 | 103 | : |
| 102 | | : .{ .r26 = true }), |
| 104 | : .{ .r26 = true, .r29 = true }), |
| 103 | 105 | // The CSKY ABI requires the gb register to point to the GOT. Additionally, the first |
| 104 | 106 | // entry in the GOT is defined to hold the address of _DYNAMIC. |
| 105 | 107 | .csky => asm volatile ( |
| ... | ... | @@ -112,7 +114,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 112 | 114 | \\ .hidden _DYNAMIC |
| 113 | 115 | \\ jump 1f |
| 114 | 116 | \\ .word _DYNAMIC - . |
| 115 | | \\ 1: |
| 117 | \\1: |
| 116 | 118 | \\ r1 = pc |
| 117 | 119 | \\ r1 = add(r1, #-4) |
| 118 | 120 | \\ %[ret] = memw(r1) |
| ... | ... | @@ -198,7 +200,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 198 | 200 | \\ .hidden _DYNAMIC |
| 199 | 201 | \\ bl 1f |
| 200 | 202 | \\ .long _DYNAMIC - . |
| 201 | | \\ 1: |
| 203 | \\1: |
| 202 | 204 | \\ mflr %[ret] |
| 203 | 205 | \\ lwz 4, 0(%[ret]) |
| 204 | 206 | \\ add %[ret], 4, %[ret] |
| ... | ... | @@ -210,7 +212,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 210 | 212 | \\ .hidden _DYNAMIC |
| 211 | 213 | \\ bl 1f |
| 212 | 214 | \\ .quad _DYNAMIC - . |
| 213 | | \\ 1: |
| 215 | \\1: |
| 214 | 216 | \\ mflr %[ret] |
| 215 | 217 | \\ ld 4, 0(%[ret]) |
| 216 | 218 | \\ add %[ret], 4, %[ret] |
| ... | ... | @@ -229,8 +231,9 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 229 | 231 | \\ larl %[ret], 1f |
| 230 | 232 | \\ ag %[ret], 0(%[ret]) |
| 231 | 233 | \\ jg 2f |
| 232 | | \\ 1: .quad _DYNAMIC - . |
| 233 | | \\ 2: |
| 234 | \\1: |
| 235 | \\ .quad _DYNAMIC - . |
| 236 | \\2: |
| 234 | 237 | : [ret] "=a" (-> [*]const elf.Dyn), |
| 235 | 238 | ), |
| 236 | 239 | .sh, .sheb => asm volatile ( |
| ... | ... | @@ -252,11 +255,12 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { |
| 252 | 255 | .sparc, .sparc64 => asm volatile ( |
| 253 | 256 | \\ sethi %%hi(_GLOBAL_OFFSET_TABLE_ - 4), %%l7 |
| 254 | 257 | \\ call 1f |
| 255 | | \\ add %%l7, %%lo(_GLOBAL_OFFSET_TABLE_ + 4), %%l7 |
| 256 | | \\ 1: |
| 258 | \\ add %%l7, %%lo(_GLOBAL_OFFSET_TABLE_ + 4), %%l7 |
| 259 | \\1: |
| 257 | 260 | \\ add %%l7, %%o7, %[ret] |
| 258 | 261 | : [ret] "=r" (-> [*]const elf.Dyn), |
| 259 | | ), |
| 262 | : |
| 263 | : .{ .l7 = true }), |
| 260 | 264 | else => { |
| 261 | 265 | @compileError("PIE startup is not yet supported for this target!"); |
| 262 | 266 | }, |