NASM中调用fopen后rax返回0的问题求助
解决NASM中fopen返回NULL的问题
可能的原因及排查步骤
验证路径与权限
先在终端执行ls /opt/P01_SH/_Test_Data/Random_int64_t.bin,确认文件真实存在且当前用户拥有读权限。Linux路径区分大小写,需检查路径中字母大小写、下划线、斜杠是否完全匹配。同时确保路径中所有父目录(如/opt/P01_SH/、/opt/P01_SH/_Test_Data/)对当前用户有执行权限(无执行权限则无法进入目录访问文件)。打印具体错误信息
fopen返回NULL时会设置errno变量,可通过perror打印错误原因,修改代码如下:mov rdi, qsort_filename mov rsi, qsort_filemode call [rel fopen wrt ..got] cmp rax, 0 jne open_done ; 输出文件打开失败的具体原因 mov rdi, qsort_filename call [rel perror wrt ..got] open_done:运行程序后会得到明确错误提示(如
Permission denied、No such file or directory),这是定位问题的关键。检查链接参数
确保编译链接时正确关联libc库。NASM编译链接示例命令:nasm -f elf64 your_program.asm -o your_program.o ld your_program.o -o your_program -lc # -lc 用于链接libc库若使用gcc链接会更简便:
gcc your_program.o -o your_program,它会自动处理libc的链接逻辑。验证GOT调用正确性
你使用的call [rel fopen wrt ..got]在ELF64模式下写法正确(结合rdi/rsi寄存器判断为64位环境)。可通过objdump -d your_program.o查看汇编代码,确认fopen的GOT引用是否正确生成。
内容的提问来源于stack exchange,提问作者RTC222
相关产品推荐
相关产品推荐

