???????????λ
??????????????????????????????λ??
????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