代码重定位
demo.c:
#include <stdio.h>
int main() {
sum(33,33);
return 1;
}
sum.c:
int func(int a, int b) {
return 1;
}
gcc -c sum.c
将机器码反汇编:
objdump -d sum.o
得到如下代码:
0000000000000000 <sum>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 89 7d fc mov %edi,-0x4(%rbp)
7: 89 75 f8 mov %esi,-0x8(%rbp)
a: 8b 45 f8 mov -0x8(%rbp),%eax
d: 8b 55 fc mov -0x4(%rbp),%edx
10: 8d 04 02 lea (%rdx,%rax,1),%eax
13: c9 leaveq
14: c3 retq
可以看到以上的代码的地址是:0000000000000000
执行链接生成可执行文件a.out(默认输出名称):
gcc demo.o sum.o
objdump -d a.out
可以看到sum模块如下:
0000000000400494 <sum>:
400494: 55 push %rbp
400495: 48 89 e5 mov %rsp,%rbp
400498: 89 7d fc mov %edi,-0x4(%rbp)
40049b: 89 75 f8 mov %esi,-0x8(%rbp)
40049e: 8b 45 f8 mov -0x8(%rbp),%eax
4004a1: 8b 55 fc mov -0x4(%rbp),%edx
4004a4: 8d 04 02 lea (%rdx,%rax,1),%eax
4004a7: c9 leaveq
4004a8: c3 retq
4004a9: 90 nop
4004aa: 90 nop
4004ab: 90 nop
4004ac: 90 nop
4004ad: 90 nop
4004ae: 90 nop
4004af: 90 nop
可以看到在实际的可执行文件a.out中,以上的sum的地址被改成了:0000000000400494
0000000000400474 <main>:
400474: 55 push %rbp
400475: 48 89 e5 mov %rsp,%rbp
400478: be 21 00 00 00 mov $0x21,%esi
40047d: bf 21 00 00 00 mov $0x21,%edi
400482: b8 00 00 00 00 mov $0x0,%eax
400487: e8 08 00 00 00 callq 400494 <sum>
40048c: b8 01 00 00 00 mov $0x1,%eax
400491: c9 leaveq
400492: c3 retq
400493: 90 nop
从以上main函数调用sum的地址也改成了400494。
总结:这个在执行链接生成可执行文件,修改sum地址的过程,叫做代码重定位