我有以下内容:
BITS 64
__NR_getuid equ 102
global sys_getuid
section .text
sys_getuid:
xor eax, eax
mov al, __NR_getuid
syscall
ret
这是用以下代码编译的:
nasm -f elf64 -o getuid.o getuid.asm
ld -shared -o libgetuid.so getuid.o
但是sys_getuid
没有出口。证人:
#include <stdio.h>
extern int sys_getuid();
int main()
{
printf("UID = %d\n", sys_getuid());
return 0;
}
gcc -o junk -L. -lgetuid junk.c
/usr/bin/ld: /tmp/ccHOc4iR.o: in function `main':
junk.c:(.text+0xa): undefined reference to `sys_getuid'
collect2: error: ld returned 1 exit status
我如何导出符号?
我显然不需要这个库的任何重定位信息,所以我应该可以这样做。
该符号已被导出:
正如 Michael Petch 所评论的,您的问题是链接线不正确。使用
允许您的可执行文件链接并运行。
在常见的 UNIX 链接器中,只有 LLD 允许“定义在引用之前”。而 Binutils GNU
ld
则gold
不允许。