【问题标题】:Generating a.out file format with GCC使用 gcc 生成 a.out 文件格式
【发布时间】:2012-01-08 08:47:21
【问题描述】:

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

使用 nasm,我可以使用 -f 标志轻松完成此操作,例如:

[user@host]$ nasm -f aout start.asm 
[user@host]$ objdump -a start.o

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

[user@host]$ 

在 linux 上,编译 .c 文件会生成一个 elf 对象。如何使用 gcc 生成 a.out 文件?

【问题讨论】:

  • 您使用的是哪个系统?我认为 Linux 不再支持 a.out 可执行文件了。我不知道中间对象文件。
  • 我相信内核可以配置为支持 a.out,但默认情况下它是关闭的。自从我编译内核以来已经有一段时间了,可能不再是这种情况了。
  • 如果在编译时启用CONFIG_BINFMT_AOUT,Linux 确实支持它。

标签: c gcc compilation executable


【解决方案1】:

要使用 gcc 生成 a.out 格式,您的链接器需要被告知这样做。由于-Wl 标志,您可以通过从 gcc 传递标志来做到这一点。

以下是您要为 a.out 格式执行的操作:

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

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

objdump -i

【讨论】:

  • 问题是,我有许多 elf 格式的目标文件 (.o),所以当我将它们与链接器脚本中的 OUTPUT_FORMAT(a.out-i386-linux) 参数链接时,我得到此错误:“不能以 a.out 对象文件格式表示节 `.comment'”。这就是为什么我需要从一开始就将“gcc -c file.c”编译成 a.out 格式,而不是 ELF。
  • 我找到了上面的解决方案,没有生成 -fno-ident 选项 .comment 部分,我用 grub 启动了我的 a.out 内核。谢谢
  • 抱歉,我错过了您的第一条评论,很高兴您自己找到了解决方法 :)
【解决方案2】:

根据这篇文章 http://gcc.gnu.org/ml/gcc-help/2006-04/msg00262.html

您需要为不同的目标 (i386-aout) 构建 gcc。听起来很合理,因为 a.out 已被弃用多年(10 年以上)。

【讨论】:

    【解决方案3】:

    这个问题有两个答案。一是你需要编译一个以 aout 为目标的新 GCC;它不像翻转命令行开关那么简单。另一个答案是一个问题:为什么你真的需要这个?我想不出一个正当的理由。

    【讨论】:

    • 我正在开发一个操作系统,我需要将内核和应用程序打包在一个图像文件中,以便通过一次读取和一次写入(整个图像)快速加载它,a.out 看起来是理想的格式,简单且受到许多引导加载程序的支持。
    猜你喜欢
    • 2011-01-22
    • 2013-10-09
    • 1970-01-01
    • 2014-03-08
    • 2021-02-17
    • 2021-08-23
    • 2018-07-27
    • 2021-12-03
    • 2017-08-18
    相关资源
    最近更新 更多