2015-08-03 108 views
0

我已完成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)爲什麼printfputsU之前它們的函數名稱?而函數foo(),CFoo::fooing1(),CFoo::fooing2(int)CFoo::fooing3(int, int)確實在它們的函數名之前有一個T

2)如何在CFoo功能之前獲得U

+0

您應該閱讀[nm命令](http://linux.about.com/library/cmd/blcmdl1_nm.htm)手冊頁。 –

+0

您可以使用'-C | --demangle''nm'選項來替代通過'C++ filt'的管道。 –

回答

2

letter U means表示符號printfputs未在您生成的庫代碼中定義。這是正常的,因爲它們是在另一個共享庫中定義的。

字母T表示代碼在庫文件中定義(文本段實際上對應於代碼;不應與數據段混淆)。

如果CFoo函數是你共享庫的核心內容,那麼最好避免在你的庫中使它們成爲U。如果仍然要實現這一點:

  • 保持在類的頭宣佈了此項CFoo功能
  • foo.cpp徹底的刪除:代碼將編譯,但功能缺失(即它不是在所有定義庫文件)
  • 但是從foo.cpp中的另一個CFoo函數中調用該函數:代碼將被編譯,此時庫文件將該函數定義爲U:這是一個符號,它定期聲明,需要,但不是找到了。
+0

我需要將'CFoo'功能設爲'U',因爲我想生成一個我有問題的小例子。 – kristian

+0

@kristian好的!我編輯過 – Christophe