3

由于缺乏使用 GCC 和 ld 的知识,我正在寻求专业人士的帮助。我正在为教育目的编写操作系统,并且在编译和链接 C 代码时遇到问题。老实说,这没有任何问题,但我对 GCC 和 LD 生成的输出文件中的不必要数据感到困惑,比如

GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 symtab..strtab..shstrtab..text..eh_frame..data..comment
.ELF..|

等等。我真的需要知道哪些参数同时用于 gcc 和 ld 以减少这种无用的(对于我的操作系统)数据

我之前使用的参数: -c -nostdlib -nostdinc -fno-builtin -fno-stack-protector -fstrength-reduce -finline-functions 我也使用链接描述文件来组织段。

我尝试使用 objcopy 来减少输出中的 .comment 和 .note 等块,对我来说这是最好的解决方案

objcopy -R .note -R .comment -S -O binary kernel.o kernel.bin
4

2 回答 2

4

拆分编译和链接阶段。使用 GCC 的“-s”选项来减少 .o 文件。(pmg 评论中的链接特别有趣,但与链接器脚本无关)

此处描述了用于简单内核的链接器脚本(使用 LD 构建内核的教程)

使用

ld -T <yourscript> <objectfilelist> -o kernel.bin

命令以获取所需的二进制文件。

于 2012-07-16T16:11:02.660 回答
1

问题可以通过链接描述文件解决。使用/DISCARD/块。ld 手册说这个块从最终输出中排除了其中列出的所有内容。

所以我在.text,.data和块之后插入了这个.bss

/DISCARD/ : 
{
    *(.comment)
    *(.eh_frame)
    *(.note.GNU-stack)
}

以及我的链接器脚本最开始的这一行,以输出平面二进制文件。

OUTPUT_FORMAT("binary")

因此,我不需要再使用objcopy了。

于 2015-10-25T13:19:30.630 回答