2011-11-28 28 views
7

如何在x86架构上使用gcc生成a.out文件格式?使用gcc生成a.out文件格式

随着NASM我可以用-f标志很容易地做到这一点,例如:

[[email protected]]$ nasm -f aout start.asm 
[[email protected]]$ objdump -a start.o 

start.o:  file format a.out-i386-linux 
start.o 

[[email protected]]$ 

在Linux,编译.c文件生成一个ELF对象。我如何使用gcc生成a.out文件?

+0

您正在使用哪个系统?我不认为Linux支持a.out可执行文件了。我不知道中间目标文件。 –

+0

我相信内核可以配置a.out支持,但默认关闭。自从我编译一个内核以来已经有一段时间了,可能不再是这种情况。 – goldfire

+0

如果在编译时启用了CONFIG_BINFMT_AOUT,Linux确实会支持它。 –

回答

11

要使用gcc生成a.out格式,需要告诉您的链接器要这样做。您可以通过从gcc传递标志来完成此操作,这要归功于-Wl标志。

这里是你的a.out格式做什么:

gcc -Wl,--oformat=a.out-i386-linux file.c -o file.out 

您还可以显示支持的所有格式键入:

objdump -i 
+0

问题是,我有许多elf格式的目标文件(.o),所以当我在链接器脚本中将它们与OUTPUT_FORMAT(a.out-i386-linux) 参数链接时,我得到以下错误:“can not以a.out目标文件格式表示“.comment”部分“。这就是为什么我需要将“gcc -c file.c”从头开始编译为a.out格式,而不是ELF。 – Nulik

+0

我发现上面的解决方案,使用-fno-ident选项.comment节没有生成,我用grub启动了我的a.out内核。谢谢 – Nulik

+0

对不起,我错过了您的第一条评论,并很高兴您发现修复自己:) –

0

这个问题有两个答案。一个是你需要编译一个新的GCC,并把它作为目标;它不像翻转命令行开关那么简单。另一个答案是一个问题:为什么你真的需要这个?我不能马上想到一个有效的理由。

+1

我正在开发一个操作系统,我需要将内核和应用程序一起打包到一个图像文件中,以便快速加载一次读取和一次写入(整个图像),a.out看起来是理想的格式,很简单,并由很多引导程序支持。 – Nulik