Linux??????????????
???????????? ???????[ 2014/12/16 14:47:17 ] ????????Linux ??????
???????????λ
??????????????????????????????λ??
????c/c++ ??????????????????λ???е???????? c/cpp ????????????????(translation unit)?? ??????????????????????????? ??????????????Щ???????????????????????????????????????????????????????(??????????)???????????????????????????????????о???????????????????????????????????????????????????????????????ν????????λ??
??????????????????????λ???е????????????????????????????????????????????????????????????????????????????????????????????????????????????е?????????????????????????????????????????????????????????ε???????????????????????????????????λ???????????????????????????????????????????????????????????????????????????????????????????????????????????????λ?????????
???????????λ?????????????????????λ????????????????????????????????????λ???????????????????????????????????????????????????????????????????????????????????????????÷?????????????????????Щ??????????????????е???????????????????x86 ?? mov ???????????????ε?????????????????????????????????????????????????е???????????????????????????????????У????????????????????????????????????????????????????????????????????????????λ?????????????????????????????????????????????????????????????????????????????????????????λ?????????????б?????????????????? LD_PRELOAD ???????
????????????????λ
????????????????λ????????????ζ??????????λ????????????????????????????????????????裺???????????????????????????t??????????????????????????
// file: a.c
int g_share = 1;
int g_func(int a)
{
g_share += a;
return a * 3;
}
// file: main.c
extern int g_share;
extern int g_func(int a);
int main()
{
int a = 42;
a = g_func(a);
return 0;
}
???????????????????????????λ??????????У??????????????????????????????????????Щ????????λ?????????????????????£??????????????????????
????// x86_64?? linux 2.6.9
????-bash-3.00$ gcc -c a.c main.c -g
????-bash-3.00$ objdump -S a.o
????????????????(???? main.o ?ж? g_func ??????????????????????)??
a.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <g_func>:
int g_share = 1;
int g_func(int a)
{
0: 55 push %rbp
1: 48 89 e5 mov %rsp??%rbp
4: 89 7d fc mov %edi??0xfffffffffffffffc(%rbp)
g_share += a;
7: 8b 45 fc mov 0xfffffffffffffffc(%rbp)??%eax
a: 01 05 00 00 00 00 add %eax??0(%rip) # 10 <g_func+0x10>
return a * 2;
10: 8b 45 fc mov 0xfffffffffffffffc(%rbp)??%eax
13: 01 c0 add %eax??%eax
}
15: c9 leaveq
16: c3 retq
??????
???·???
??????????????????
2023/3/23 14:23:39???д?ò??????????
2023/3/22 16:17:39????????????????????Щ??
2022/6/14 16:14:27??????????????????????????
2021/10/18 15:37:44???????????????
2021/9/17 15:19:29???·???????·
2021/9/14 15:42:25?????????????
2021/5/28 17:25:47??????APP??????????
2021/5/8 17:01:11