2011-04-13 78 views
8

我遇到以下問題。我寫了一個共享庫共享庫構造函數未執行

#include <stdio.h> 
#include <stdlib.h> 

static void __attribute__ ((constructor)) test_init(void); 
static void __attribute__ ((destructor)) test_clean(void); 

/* Initialization */ 
static void  test_init(void){ 
     fprintf(stderr,"initialized\n"); 
     fflush(stderr); 
} 
/* CleanUp */ 
static void test_clean(void){ 
     fprintf(stderr,"cleaned up\n"); 
     fflush(stderr); 
} 

double test (double x){ 
    return 2.0*x; 
} 

而且使用

GCC -c -fPIC testlib.c -o testlib.o

LD -shared -o libtest.so testlib.o

編譯

然後我包括它變成一個測試程序

#include <stdio.h> 
#include <stdlib.h> 
extern double test(double x); 
void main(void){ 

    printf("%.10e\n",test(10.0)); 
} 

我編譯並開始使用

gcc testprog.c -o testprog -L。 -ltest

LD_LIBRARY_PATH =。 ./testprog

然後輸出由

2.0000000000e給定+ 01

這意味着構造/析構不會執行。在另一方面,如果我編譯

AR RVS testlib.a testlib.o

GCC testprog.c testlib.a -o testprog

該程序的輸出由

給出testprog 初始化 2.0000000000e + 01 清理

爲什麼構造函數在動態鏈接時不能執行?

我使用下面的版本

GNU LD(GNU Binutils的;的openSUSE 11.3)2.20.0.20100122-6 gcc版本4.5.0 20100604 [GCC-4_5-分支修訂160292](SUSE Linux)的

預先感謝您的幫助!

編輯:2011-04-13,11:05

非常感謝您luxifer,

文檔間接地幫助了!神奇的暗示是一個應該包括通過編譯鏈接...

的gcc -fPIC -shared testlib.c 輪候冊,-soname,libtest.so -o libtest.so

作品!

+0

main()的返回類型爲int。總是。 – Thomas 2012-04-13 21:26:46

回答

-2

本文是爲參考,但我過來給您的辦公提供方便:)

我不是對領域的專家,但快速谷歌搜索給了我this。只讀文檔的開始,如果我正確的解決了這個問題,問題是這樣的:

靜態鏈接你的程序在執行時是自包含的......它包含了整個庫,當它完全加載到內存中時你運行它。

動態鏈接時,庫函數從你的程序在執行時被稱爲連接嘗試通過查看它是否有一些庫的實現,以解決上的功能都尚未解決的引用。如果是這樣,它加載此實現,即僅僅是功能代碼。

所以,如果我得到這個權利和動態連接器只是用來加載庫的部分,即需要的功能,而不是整個庫,然後這可以解釋爲什麼當你的庫是動態鏈接你的構造不叫。

4

Gcc的構造函數處理與ELF構造函數處理不是一回事,而是位於它的頂層。爲了工作,你需要的是在GCC的啓動文件中提供的膠水代碼鏈接。

做到這一點的最簡單方法是使用gcc鏈接:

gcc -shared -o testlib.so testlib.o