当前位置: 技术问答>linux和unix
关于C语言的问题
来源: 互联网 发布时间:2017-03-17
本文导语: 这些天,一直在看操作系统方面的书籍,包括《Linux0.11内核完全注释》和《自己动手写操作系统》。自己写了一点代码,目前用汇编写引导扇区和进入保护模式都通过了,现在准备用C语言继续写些代码做些实验。本...
这些天,一直在看操作系统方面的书籍,包括《Linux0.11内核完全注释》和《自己动手写操作系统》。自己写了一点代码,目前用汇编写引导扇区和进入保护模式都通过了,现在准备用C语言继续写些代码做些实验。本以为可以高高兴兴步入C,结果问题来了..用gcc编译C程序得到的是ELF格式的,今天研究了下ELF格式,弄了个半懂。说实话,现在就想快速用C做些开发, 真的不大想花大精力研究其他文件格式,所以特来问下,用C写的程序一定先被编译成ELF格式的吗,或其他经过加工的二进制? 有没有办法直接生成对应的二进制代码?不知道当时linux0.11的映像文件是如何编译得到的
|
@max_godlike,
通过GCC编译输出的是ELF文件格式,但是toolchain里面有一个工具objcopy将elf转化为可以直接运行的binary文件。参考命令如下(具体自己查看对应的man 手册吧):
# objcopy -O binary -R .note -R .comment -S output.elf output.bin
下面再说下ELF与binary的区别:
ELF要运行一般是需要加载器来复杂加载运行的,加载器要负责处理重定位表,符号等。而binary格式是可以直接从入口地址运行的。bootloader(uboot)与kernel的映像文件(image)你就可以理解为是先用gcc编译为elf文件,然后在用objcopy工具转化binary的。所以他们可以直接烧到flash上运行,不需要要加载器。
通过GCC编译输出的是ELF文件格式,但是toolchain里面有一个工具objcopy将elf转化为可以直接运行的binary文件。参考命令如下(具体自己查看对应的man 手册吧):
# objcopy -O binary -R .note -R .comment -S output.elf output.bin
下面再说下ELF与binary的区别:
ELF要运行一般是需要加载器来复杂加载运行的,加载器要负责处理重定位表,符号等。而binary格式是可以直接从入口地址运行的。bootloader(uboot)与kernel的映像文件(image)你就可以理解为是先用gcc编译为elf文件,然后在用objcopy工具转化binary的。所以他们可以直接烧到flash上运行,不需要要加载器。