探究动态库函数的地址是在何时确定的

本文探讨了动态库函数如printf的地址如何在程序运行时确定。通过分析main函数的反汇编,揭示了程序如何通过全局偏移表和动态链接器来查找和调用动态库函数的过程。在程序启动后,动态链接器修改初始跳转地址,使得第二次执行时能直接跳转到正确的函数地址。

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

问题描述


写了一段main函数:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
	printf("hello world\n");
	printf("12345678\n");

	_exit(0);
}

很简单,两条打印。但是printf属于glibc动态链接库,是在程序运行的时候再加载链接进来的,那么这里的main函数是如何确定printf的地址的呢?

从main函数的反汇编开始分析

先看下main函数的反汇编:

0000000000400566 <main>:
  400566:	55                   	push   %rbp
  400567:	48 89 e5             	mov    %rsp,%rbp
  40056a:	48 83 ec 10          	sub    $0x10,%rsp
  40056e:	89 7d fc             	mov    %edi,-0x4(%rbp)
  400571:	48 89 75 f0          	mov    %rsi,-0x10(%rbp)
  400575:	bf 24 06 40 00       	mov    $0x400624,%edi
  40057a:	e8 c1 fe ff ff       	callq  400440 <puts@plt>
  40057f:	bf 30 06 40 00       	mov    $0x400630,%edi
  400584:	e8 b7 fe ff ff       	callq  400440 <puts@plt>
  400589:	bf 00 00 00 00       	mov    $0x0,%edi
  40058e:	e8 9d fe ff ff       	call
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值