c语言链接过程

本文深入解析了GCC编译过程中最后一步——链接的具体操作。通过示例程序解释如何使用GCC及LD命令进行链接,并展示了如何自定义启动函数,跳过默认的启动文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇讲到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符号

本文到此结束,不擅长规划格式,写的不怎么好,各位看官见谅了,有问题欢迎指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值