上一篇讲到gcc处理的四个过程,这一篇主要讲解c语言生成可执行文件的最后一个阶段: 链接
现有以下程序
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
通过gcc -c test.c 生成二进制文件test.o,这时只有一个模块,程序不可能在这种情况下运行,想要运行该怎么办了,那就要链接来,将 驱动他的程序链接进来,可以理解为链接驱动程序吧,任何硬件的有效运行都必然有着它的驱动程序,当然程序一般不只是链接驱动程序,也会链接基于驱动程序开发的其他三方库,这里还会链接gcc的标准库
链接可直接通过gcc test.o 实现, 也可以通过gcc -v test.o 查看最后一行链接选项通过ld实现
如下所示
ld /usr/lib64/crt1.o /usr/lib64/crti.o /usr/lib64/crtn.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib64 -L/usr/lib -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed test.o -o test
使用ld链接的真正启动函数是_start, 其会链接的gcc的函数在走向main函数,main函数作为启动函数其实是可改的
有以下程序start_test.c
#include <stdio.h>
int start_test()
{
printf("hello world!\n");
return 0;
}
gcc -c start_test.c
gcc start_test.o -o start_test -Wl,–entry=start_test -nostartfiles
生存 start_test 可执行文件, 运行后可得到正常输出,必须先执行 -c 指令,这样就能在二进制文件中生成函数start_test符号
本文到此结束,不擅长规划格式,写的不怎么好,各位看官见谅了,有问题欢迎指出