查找动态库函数的过程分析:用GDB跟踪汇编代码
查找动态库函数的过程分析:用GDB跟踪汇编代码
在一个最简单的hello world程序中,printf是一个属于libc库的动态库函数。在编译时是不知道printf所在地址的,那么,在程序运行的时候是怎么找到printf所在地址并且跳到那个地址去执行的呢?本文将以printf为例,用GDB跟踪动态库函数的查找过程。汇编以MIPS为例, 以后有时间再分析ARM版本的。
首先给出程序代码:
- #include <stdio.h>
- int main(int argc, char* argv[])
- {
- printf("Hello world %d.\n", argc);
- return 0;
- }
- mipsel-linux-gnu-gcc main.c -o main
- mipsel-linux-gnu-objdump -xD main > main.dump
在得到的main.dump文件中, 找到main函数所在的地方如下:
- 004005b0 <main>:
- 4005b0: 27bdffe8 addiu sp,sp,-24
- 4005b4: afbf0014 sw ra,20(sp)
- 4005b8: afbe0010 sw s8,16(sp)
- 4005bc: 03a0f021 move s8,sp
- 4005c0: afc40018 sw a0,24(s8)
- 4005c4: afc5001c sw a1,28(s8)
- 4005c8: 3c020040 lui v0,0x40
- 4005cc: 24440760 addiu a0,v0,1888
- 4005d0: 8fc50018 lw a1,24(s8)
- 4005d4: 3c020040 lui v0,0x40
- 4005d8: 24590470 addiu t9,v0,1136
- 4005dc: 0320f809 jalr t9
- 4005e0: 00000000 nop
- 4005e4: 00001021 move v0,zero
- 4005e8: 03c0e821 move sp,s8
- 4005ec: 8fbf0014 lw ra,20(sp)
- 4005f0: 8fbe0010 lw s8,16(sp)
- 4005f4: 27bd0018 addiu sp,sp,24
- 4005f8: 03e00008 jr ra
- 4005fc: 00000000 nop
- 00400470 <printf@plt>:
- 400470: 3c0f0041 lui t7,0x41
- 400474: 8df907c0 lw t9,1984(t7)
- 400478: 25f807c0 addiu t8,t7,1984
- 40047c: 03200008 jr t9
- 400480: 00000000 nop
- Disassembly of section .got.plt:
- 004107b4 <.got.plt>:
- ...
- 4107bc: 00400440 0x400440
- 4107c0: 00400440 0x400440
- Disassembly of section .plt:
- 00400440 <_PROCEDURE_LINKAGE_TABLE_>:
- 400440: 3c1c0041 lui gp,0x41
- 400444: 8f9907b4 lw t9,1972(gp)
- 400448: 279c07b4 addiu gp,gp,1972
- 40044c: 031cc023 subu t8,t8,gp
- 400450: 03e07821 move t7,ra
- 400454: 0018c082 srl t8,t8,0x2
- 400458: 0320f809 jalr t9
- 40045c: 2718fffe addiu t8,t8,-2
- 00400460 <__libc_start_main@plt>:
- 400460: 3c0f0041 lui t7,0x41
- 400464: 8df907bc lw t9,1980(t7)
- 400468: 25f807bc addiu t8,t7,1980
- 40046c: 03200008 jr t9
- Contents of section .got.plt:
- 4107b4 00000000 00000000 40044000 40044000 ........@.@.@.@.
|
评论暂时关闭