当前位置: 技术问答>linux和unix
Linux中程序如何调用printf等C库函数?
来源: 互联网 发布时间:2017-01-14
本文导语: #include int main(int argc, char** argv) { printf("hello worldnprintf:%x", printf); return 0; } 反汇编后,大致如下: 08048320 : 8048320: ff 25 08 a0 04 08 jmp *0x804a008 8048326: 68 10 00 00 00 push $0x10 804832b: e9 c0 ff...
#include
int main(int argc, char** argv)
{
printf("hello worldnprintf:%x", printf);
return 0;
}
反汇编后,大致如下:
08048320 :
8048320: ff 25 08 a0 04 08 jmp *0x804a008
8048326: 68 10 00 00 00 push $0x10
804832b: e9 c0 ff ff ff jmp 80482f0
int main(int argc, char** argv)
{
80483e4: 55 push %ebp
80483e5: 89 e5 mov %esp,%ebp
80483e7: 83 e4 f0 and $0xfffffff0,%esp
80483ea: 83 ec 10 sub $0x10,%esp
printf("hello worldnprintf:%x", printf);
80483ed: b8 d0 84 04 08 mov $0x80484d0,%eax
80483f2: c7 44 24 04 20 83 04 movl $0x8048320,0x4(%esp)
80483f9: 08
80483fa: 89 04 24 mov %eax,(%esp)
80483fd: e8 1e ff ff ff call 8048320
return 0;
8048402: b8 00 00 00 00 mov $0x0,%eax
8048407: c9 leave
8048408: c3 ret
8048409: 90 nop
...
这里我不太理解的是:
08048320 :
8048320: ff 25 08 a0 04 08 jmp *0x804a008
8048326: 68 10 00 00 00 push $0x10
804832b: e9 c0 ff ff ff jmp 80482f0
谁能详细解释下吗。
另外程序被加载时,load程序如何链接libc库中的printf函数呢,通过上面的汇编能反映出来不?
|
中的plt是一个函数跳转表,跳到全局偏移表got中。在got中有print函数的绝对地址,该绝对地址是动态链接时候解析获得的。
上面汇编反映不出链接过程,需要看源代码。
上面汇编反映不出链接过程,需要看源代码。