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