你对编译链接的理解很混乱。头文件的处理发生在预编译期,预编译器将头文件的内容替换到#include指令处,并处理所有的宏。而.o是编译得到的目标文件,它不能直接执行,还需要链接到编译器提供的某些执行初始化和清理操作的c runtime目标文件,如crt1.o,crtbegin.o,crtend.o等;如果调用了标准库函数还需要链接到glibc,才能生成最终的可执行文件。
那么是否可以编译一段代码,它不需要链接到任何其他目标文件和库就可以执行?答案是肯定的,这样的代码叫做裸机程序。在gcc编译时指定-nostdlib -fno-builtin选项,那么gcc就不会链接到任何crt,也不会使用builtin函数。此时,这样生成的目标文件是没办法用默认脚本链接的,因为原先约定的_start入口点已经不成立,你需要手工编写链接脚本指定入口点。
那么是否可以编译一段代码,它不需要链接到任何其他目标文件和库就可以执行?答案是肯定的,这样的代码叫做裸机程序。在gcc编译时指定-nostdlib -fno-builtin选项,那么gcc就不会链接到任何crt,也不会使用builtin函数。此时,这样生成的目标文件是没办法用默认脚本链接的,因为原先约定的_start入口点已经不成立,你需要手工编写链接脚本指定入口点。