github.com/eh-steve/goloader@v0.0.0-20240111193454-90ff3cfdae39/libc/lookup_libc_darwin_amd64.s (about) 1 #include "textflag.h" 2 3 TEXT ·libc_dlopen_trampoline(SB),NOSPLIT,$0 4 PUSHQ BP // make a frame; keep stack aligned 5 MOVQ SP, BP 6 MOVQ DI, BX 7 MOVQ 0(BX), DI // arg 1 soPath 8 MOVQ 8(BX), SI // arg 2 flags 9 CALL libc_dlopen(SB) 10 XORL DX, DX 11 CMPQ AX, $-1 12 JNE ok 13 CALL libc_error(SB) 14 MOVLQSX (AX), DX // errno 15 XORL AX, AX 16 ok: 17 MOVQ AX, 16(BX) 18 MOVQ DX, 24(BX) 19 POPQ BP 20 RET 21 22 TEXT ·libc_dlsym_trampoline(SB),NOSPLIT,$0 23 PUSHQ BP // make a frame; keep stack aligned 24 MOVQ SP, BP 25 MOVQ DI, BX 26 MOVQ 0(BX), DI // arg 1 handle 27 MOVQ 8(BX), SI // arg 2 symName 28 CALL libc_dlsym(SB) 29 XORL DX, DX 30 CMPQ AX, $-1 31 JNE ok 32 CALL libc_error(SB) 33 MOVLQSX (AX), DX // errno 34 XORL AX, AX 35 ok: 36 MOVQ AX, 16(BX) 37 POPQ BP 38 RET 39 40 // Go 1.21 automatically wraps asm funcs with a BP push/pop to create a frame, so no need to do it ourselves 41 TEXT ·libc_dlopen_noframe_trampoline(SB),NOSPLIT,$0 42 MOVQ DI, BX 43 MOVQ 0(BX), DI // arg 1 soPath 44 MOVQ 8(BX), SI // arg 2 flags 45 CALL libc_dlopen(SB) 46 XORL DX, DX 47 CMPQ AX, $-1 48 JNE ok 49 CALL libc_error(SB) 50 MOVLQSX (AX), DX // errno 51 XORL AX, AX 52 ok: 53 MOVQ AX, 16(BX) 54 MOVQ DX, 24(BX) 55 RET 56 57 TEXT ·libc_dlsym_noframe_trampoline(SB),NOSPLIT,$0 58 MOVQ DI, BX 59 MOVQ 0(BX), DI // arg 1 handle 60 MOVQ 8(BX), SI // arg 2 symName 61 CALL libc_dlsym(SB) 62 XORL DX, DX 63 CMPQ AX, $-1 64 JNE ok 65 CALL libc_error(SB) 66 MOVLQSX (AX), DX // errno 67 XORL AX, AX 68 ok: 69 MOVQ AX, 16(BX) 70 RET