You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 09:12:20