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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:27:07