我已完成this tutorial here以瞭解如何生成共享庫。我添加了一些較小的東西,因爲我想測試一些東西。這裏是馬源代碼:共享庫中的符號
強大的文本
#ifndef foo_h__
#define foo_h__
void foo(void);
class CFoo
{
public:
void fooing1();
void fooing2(int a);
void fooing3(int a, int b = 0);
};
#endif // foo_h__
Foo.cpp中
#include <stdio.h>
#include "foo.h"
void foo(void)
{
puts("Hello, I'm a shared library");
}
void CFoo::fooing1()
{
puts("CFoo::fooing1()");
}
void CFoo::fooing2(int a)
{
printf("CFoo::fooing2(%d)\n", a);
}
void CFoo::fooing3(int a, int b)
{
printf("CFoo::fooing3(%d, %d)\n", a, b);
}
的main.c
#include <stdio.h>
#include "foo.h"
int main(void)
{
puts("This is a shared library test...");
foo();
CFoo *foo1 = new CFoo();
foo1->fooing1();
foo1->fooing2(12);
foo1->fooing3(1);
foo1->fooing3(1, 2);
delete foo1;
return 0;
}
而構建腳本
g++ -c -Wall -Werror -fpic foo.cpp
g++ -shared -o libfoo.so foo.o
g++ -Wall -o test main.c -lfoo -L.
當鍵入命令時nm -D libfoo.so | c++filt
,我得到這樣的輸出:
0000000000201040 B __bss_start
w __cxa_finalize
0000000000201040 D _edata
0000000000201048 B _end
0000000000000818 T _fini
w __gmon_start__
0000000000000640 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
U printf
U puts
0000000000000796 T foo()
00000000000007a8 T CFoo::fooing1()
00000000000007c2 T CFoo::fooing2(int)
00000000000007ea T CFoo::fooing3(int, int)
我有兩個問題:
1)爲什麼printf
和puts
有U
之前它們的函數名稱?而函數foo()
,CFoo::fooing1()
,CFoo::fooing2(int)
和CFoo::fooing3(int, int)
確實在它們的函數名之前有一個T
?
2)如何在CFoo
功能之前獲得U
?
您應該閱讀[nm命令](http://linux.about.com/library/cmd/blcmdl1_nm.htm)手冊頁。 –
您可以使用'-C | --demangle''nm'選項來替代通過'C++ filt'的管道。 –