假设:
某可执行程序exe依赖liba中的funcA和libb中的funcB, liba和libb中定义了同名的函数subfunc,供funcA和funcB调用,两个库中的subfunc实现不同,一个是相加,一个是相减。
liba.so / liba.a对应cpp
int subfunc(int a, int b) {
return a + b;
}
int funcA(int a, int b) {
return subfunc(a, b);
}
libB.so / libB.a对应cpp
int subfunc(int a, int b) {
return a - b;
}
int funcB(int a, int b) {
return subfunc(a, b);
}
exe代码:
#include <cstdio>
int funcB(int, int);
int funcA(int, int);
int main()
{
printf("%d,", funcA(2, 1));
printf("%d\n", funcB(2, 1));
return 0;
}
分别编译a的静态库和动态库,通过readelf或其他二进制工具查看liba的符号信息:
root@lg-Latitude-7390:/opt/lg/cpp_learn/thread_test/build# readelf -s ../liba.a
文件:../liba.a(main.cpp.o)
Symbol table '.symtab' contains 10 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS main.cpp
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 3
4: 0000000000000000 0 SECTION LOCAL DEFAULT 4
5: 0000000000000000 0 SECTION LOCAL DEFAULT 6
6: 0000000000000000 0 SECTION LOCAL DEFAULT 7
7: 0000000000000000 0 SECTION LOCAL DEFAULT 5
8: 0000000000000000 20 FUNC GLOBAL DEFAULT 1 _Z7subfuncii
9: 0000000000000014 31 FUNC GLOBAL DEFAULT 1 _Z5funcAii
root@lg-Latitude-7390:/opt/lg/cpp_learn/thread_test/build# readelf -s ../liba.so
Symbol table '.dynsym' contains 15 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000560 0 SECTION LOCAL DEFAULT 7
2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __cxa_finalize
3: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable
4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab
5: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses
6: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
7: 0000000000201038 0 NOTYPE GLOBAL DEFAULT 19 _edata
8: 00000000000006c0 20 FUNC GLOBAL DEFAULT 9 _Z7subfuncii
9: 0000000000201040 0 NOTYPE GLOBAL DEFAULT 20 _end
10: 0000000000000560 0 FUNC GLOBAL DEFAULT 7 _init
11: 0000000000201038 0 NOTYPE GLOBAL DEFAULT 20 __bss_start
12: 00000000000006f3 11 FUNC GLOBAL DEFAULT 9 main
13: 00000000000006d4 31 FUNC GLOBAL DEFAULT 9 _Z5funcAii
14: 0000000000000700 0 FUNC GLOBAL DEFAULT 10 _fini
Symbol table '.symtab' contains 53 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000000001c8 0 SECTION LOCAL DEFAULT 1
2: 00000000000001f0 0 SECTION LOCAL DEFAULT 2
3: 0000000000000238 0 SECTION LOCAL DEFAULT 3
4: 00000000000003a0 0 SECTION LOCAL DEFAULT 4
5: 0000000000000458 0 SECTION LOCAL DEFAULT 5
6: 0000000000000518 0 SECTION LOCAL DEFAULT 6
7: 0000000000000560 0 SECTION LOCAL DEFAULT 7
8: 0000000000000580 0 SECTION LOCAL DEFAULT 8
9: 00000000000005c0 0 SECTION LOCAL DEFAULT 9
10: 0000000000000700 0 SECTION LOCAL DEFAULT 10
11: 000000000000070c 0 SECTION LOCAL DEFAULT 11
12: 0000000000000738 0 SECTION LOCAL DEFAULT 12
13: 0000000000200e30 0 SECTION LOCAL DEFAULT 13
14: 0000000000200e38 0 SECTION LOCAL DEFAULT 14
15: 0000000000200e40 0 SECTION LOCAL DEFAULT 15
16: 0000000000200e48 0 SECTION LOCAL DEFAULT 16
17: 0000000000200fd8 0 SECTION LOCAL DEFAULT 17
18: 0000000000201000 0 SECTION LOCAL DEFAULT 18
19: 0000000000201030 0 SECTION LOCAL DEFAULT 19
20: 0000000000201038 0 SECTION LOCAL DEFAULT 20
21: 0000000000000000 0 SECTION LOCAL DEFAULT 21
22: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
23: 0000000000200e40 0 OBJECT LOCAL DEFAULT 15 __JCR_LIST__
24: 00000000000005c0 0 FUNC LOCAL DEFAULT 9 deregister_tm_clones
25: 0000000000000600 0 FUNC LOCAL DEFAULT 9 register_tm_clones
26: 0000000000000650 0 FUNC LOCAL DEFAULT 9 __do_global_dtors_aux
27: 0000000000201038 1 OBJECT LOCAL DEFAULT 20 completed.7262
28: 0000000000200e38 0 OBJECT LOCAL DEFAULT 14 __do_global_dtors_aux_fin
29: 0000000000000690