从C调用极简NASM函数触发段错误问题排查
问题排查与解决
1. 确保汇编函数符合x86-64 System V ABI并正确导出符号
段错误发生在call指令时,核心原因大概率是汇编函数未正确暴露入口,或者缺少返回指令。正确的corr.asm代码应如下:
global corr ; 导出函数符号,让链接器能定位到入口 corr: mov rax, 0 ; x86-64 System V ABI规定,rax寄存器用于返回整数结果 ret ; 必须用ret指令返回,否则会执行后续垃圾代码触发段错误
2. 检查C文件的函数声明
C代码必须提前声明汇编函数原型,避免编译器按错误的调用约定处理:
#include <stdio.h> // 声明汇编函数的原型 int corr(); int main() { int res = corr(); printf("返回值:%d\n", res); return 0; }
3. 使用正确的编译链接流程
Linux x86-64环境下,必须先用NASM将汇编代码编译为ELF64目标文件,再与C代码链接:
- 汇编编译:
nasm -f elf64 corr.asm -o corr.o - 编译并链接:
gcc test.c corr.o -o test
如果直接用gcc corr.asm test.c,GCC会默认用GAS语法解析NASM代码,必然导致链接错误。
4. 验证符号是否正确导出
用nm命令查看目标文件的符号表,确认corr是全局代码段符号:
nm corr.o # 正确输出应为:0000000000000000 T corr
如果符号表中没有corr,说明global corr声明缺失,链接器会生成错误的跳转地址,触发段错误。
内容的提问来源于stack exchange,提问作者Hal Gee
相关产品推荐
相关产品推荐

