0%

List symbols in shared library

有時候有其需要,知道Shared Library當中有哪些符號,這時候可以這樣做。
以下是我們的測試程式

1
2
3
4
5
6
7
8
int bar;
void foo() {}
class Foo {
static int value;
void Bar(int);
};
int Foo::value = 0;
void Foo::Bar(int) {}

Linux

在Linux底下可以用nm來指令

1
$ nm -gC test.so
  • g 列出所有External symbols
  • c 由於C++支援Function overload,要區別同名的函數名稱的話,需要在後方加上一些符號以供區別,而Demangle就是讓這些奇形怪狀的符號變成人可以看懂得版本。
    以上的結果如下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    000000000020102c 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有介紹,日後在補上。