从二进制代码来看静态链接本质

本文深入探讨静态链接的本质,通过分析二进制代码,展示了如何将两个源文件a.c和b.c链接成ab。通过objdump命令查看各阶段的段信息,揭示了代码和数据段的合并过程,以及未定义变量和函数在链接后的正确地址处理,解释了静态链接中地址的计算方式。

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

    静态链接大家并不陌生,本文将从二进制代码来分析静态链接的本质。


    首先列出将要静态的链接的两个源文件,它们分别是a.c和b.c,最后链接成功的文件为ab。

    a.c代码如下:

extern int shared;
extern void swap(int * ,int *);

int main(){
	int a = 100;
	swap( &a, &shared );
}

    b.c代码如下:

int shared = 1;

void swap( int* a, int* b )
{
	*a ^= *b ^= *a ^= *b;
}

    首先使用命令 gcc -c a.cgcc -c b.c 生成可重定位文件a.o和b.o。

    接着使用命令objdump -h a.oobjdump -h b.o来查看可重定位文件的各个基本段。

    分别显示如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值