如何在NASM中将符号导出至共享库?解决sys_getuid未导出问题
解决NASM共享库符号未导出问题
问题分析
你编写的NASM代码已通过global sys_getuid声明全局符号,但编译为共享库后,C程序链接时仍提示未定义引用,核心原因是ELF共享库中全局符号的默认可见性可能被限制为hidden,无法被外部程序引用。
解决方案一:显式设置符号可见性
修改NASM代码,在global声明中指定符号可见性为default,确保符号被导出:
BITS 64 __NR_getuid equ 102 global sys_getuid:visibility=default 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
解决方案二:链接时强制导出所有全局符号
若不想修改汇编代码,可在使用ld链接共享库时添加-export-dynamic参数,强制导出所有全局符号:
nasm -f elf64 -o getuid.o getuid.asm ld -shared -export-dynamic -o libgetuid.so getuid.o
验证符号是否导出
用nm命令检查共享库中的符号:
nm -D libgetuid.so
输出中若包含T sys_getuid,说明符号已成功导出。
测试C程序
编译并运行C程序时,需临时设置环境变量让系统找到共享库:
gcc -o junk -L. -lgetuid junk.c LD_LIBRARY_PATH=. ./junk
内容的提问来源于stack exchange,提问作者Joshua
相关产品推荐
相关产品推荐

