blob: 438923d130bbbad8294e52b38a270433011a0943 [file] [log] [blame]
; At present, nasm doesn't seem to support PIC generation for Mach-O.
; The PIC support code below is a little tricky.
[extern func]
SECTION .rodata
const_base:
%define GOTOFF(got,sym) (got) + (sym) - const_base
%imacro get_GOT 1
; NOTE: this macro destroys ecx resister.
call %%geteip
add ecx, byte (%%ref - $)
jmp short %%adjust
%%geteip:
mov ecx, [esp]
ret
%%adjust:
push ebp
xor ebp,ebp ; ebp = 0
%ifidni %1,ebx ; (%1 == ebx)
; db 0x8D,0x9C + jmp near const_base =
; lea ebx, [ecx+ebp*8+(const_base-%%ref)] ; 8D,9C,E9,(offset32)
db 0x8D,0x9C ; 8D,9C
jmp near const_base ; E9,(const_base-%%ref)
%%ref:
%else ; (%1 != ebx)
; db 0x8D,0x8C + jmp near const_base =
; lea ecx, [ecx+ebp*8+(const_base-%%ref)] ; 8D,8C,E9,(offset32)
db 0x8D,0x8C ; 8D,8C
jmp strict near const_base ; E9,(const_base-%%ref)
%%ref: mov %1, ecx
%endif ; (%1 == ebx)
pop ebp
%endmacro
SECTION .text
jmp const_base
get_GOT ebx
jmp const_base
call func
ret