我正在寻求专业人士的帮助,因为我缺乏使用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
答案 0 :(得分:4)
拆分编译和链接阶段。使用GCC的“-s”选项来减少.o文件。 (pmg注释中的链接特别有意义,但与链接器脚本无关)
简单内核的链接器脚本描述为here (tutorial for building the kernel using LD)。
使用
ld -T <yourscript> <objectfilelist> -o kernel.bin
命令获取所需的二进制文件。
答案 1 :(得分:1)
问题可以通过链接描述文件解决。使用/DISCARD/
阻止。 Ld手册说这个块排除了最终输出中列出的所有内容。
所以我在.text
,.data
和.bss
块之后插入了此块
/DISCARD/ :
{
*(.comment)
*(.eh_frame)
*(.note.GNU-stack)
}
在我的链接描述文件的最开头,这行也可以输出一个平面二进制文件。
OUTPUT_FORMAT("binary")
因此,我不再需要使用objcopy
。