问题描述
写了一段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