链接汇编程序时遇问题:文件格式未被识别,求解决方案
解决汇编程序链接时“文件格式未被识别”的问题
你遇到的这个“文件格式未被识别”错误,大概率是汇编器输出的目标文件格式和链接器不兼容导致的,我给你一步步梳理解决办法:
首先,先把你的汇编代码补全(你提供的代码里缺少了调用printf后的退出逻辑,不补全的话程序运行会出问题),完整的nasm风格x86-64代码如下:
extern printf ; 要调用的C函数 section .data ; 数据段,已初始化变量 msg: db "Hello world", 0 ; C字符串需要以0结尾 fmt: db "%s", 10, 0 ; printf格式,包含换行符'\n'和结束符'0' section .text ; 代码段 global main ; gcc标准入口点 main: ; 程序入口标签 push rbp ; 设置栈帧,必须对齐 mov rdi,fmt mov rsi,msg mov rax,0 call printf ; 调用C标准库的printf函数 pop rbp ; 恢复栈帧 ret ; 退出程序返回给操作系统
接下来是关键的编译和链接步骤:
用nasm编译生成兼容的目标文件
一定要指定输出格式为elf64(针对64位Linux系统,这是gcc链接器能识别的格式),命令如下:nasm -f elf64 hello.asm -o hello.o如果你用的是32位系统,把
elf64替换成elf32即可。用gcc链接生成可执行程序
直接用gcc链接目标文件,它会自动处理C标准库的依赖:gcc hello.o -o hello运行验证
执行生成的可执行文件,就能看到预期的输出了:./hello
错误原因解析
- 如果你编译时没加
-f elf64参数,nasm默认会输出bin格式的纯二进制文件,这种格式gcc的链接器无法识别,就会抛出“文件格式未被识别”的错误。 - 另外,如果你误用了GAS(GNU汇编器)来编译nasm风格的代码,也会导致目标文件格式异常,所以一定要用nasm来处理你写的这种语法风格的汇编代码。
内容的提问来源于stack exchange,提问作者MivVG
相关产品推荐
相关产品推荐

