有時候有其需要,知道Shared Library當中有哪些符號,這時候可以這樣做。
以下是我們的測試程式
1 | int bar; |
Linux
在Linux底下可以用nm
來指令
1 | $ nm -gC test.so |
g
列出所有External symbolsc
由於C++支援Function overload,要區別同名的函數名稱的話,需要在後方加上一些符號以供區別,而Demangle就是讓這些奇形怪狀的符號變成人可以看懂得版本。
以上的結果如下1
2
3
4
5
6
7
8
9
10
11
12
13
14000000000020102c B bar
0000000000201028 B __bss_start
w __cxa_finalize@@GLIBC_2.2.5
0000000000201028 D _edata
0000000000201038 B _end
00000000000006e4 T _fini
w __gmon_start__
00000000000005a0 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
00000000000006d0 T foo()
00000000000006d6 T Foo::Bar(int)
0000000000201030 B Foo::value
Windows
需要額外一個步驟,用一個Exporting from a DLL Using DEF Files倒出foo這個函數。
Windows底下可以用DLL Export Viewer。
而我們只看到foo,而沒有clas被輸出。輸出一個class不能用Def那種方式,如果需要的話,可以用dllexport這種方式。
這邊可見Windows跟Unix設計上的不同,Unix是預設把所有Symbols列出,然後需要的在隱藏。而Windows是需要的在列出。
至於如何隱藏,Binary Hacks有介紹,日後在補上。