共享库构造函数未执行

| 我有以下问题。我写一个共享库
#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 程序的输出由 测试程序 已初始化 2.0000000000e + 01 清理 如果动态链接库,为什么不执行构造函数? 我使用以下版本 GNU ld(GNU Binutils; openSUSE 11.3)2.20.0.20100122-6 gcc版本4.5.0 20100604 [gcc-4_5-branch修订版160292](SUSE Linux) 预先感谢您的帮助! 编辑日期:2011-04-13,11:05 非常感谢luxifer, 该文件间接帮助了!神奇的提示是,应该通过编译器来包含链接器。   gcc -fPIC testlib.c-共享   -Wl,-soname,libtest.so -o libtest.so 作品!!!     
已邀请:
这段文字仅供参考,不过为了方便起见,我还是来您的办公室:) 我不是该领域的专家,但是Google的快速搜索为我提供了这一点。仅阅读文档的开头,如果我读对了,问题是这样的: 静态链接您的程序在执行时是独立的...它具有整个库,并且在您运行它时已完全加载到内存中。 在执行时从程序中调用库函数时,动态链接了该链接器,尝试通过查看链接器是否在某些库中实现来解决该函数上所有未解析的引用。如果是这样,它将加载此实现,即仅加载功能代码。 因此,如果我做对了,而动态链接器仅加载了部分库(即所需的函数)而不是整个库,那么这将解释为什么在动态链接库时未调用构造函数的原因。     
Gcc的构造函数处理与ELF构造函数处理不同,而是位于它之上。要工作,您需要链接gcc \的启动文件中提供的粘合代码。 最简单的方法是使用gcc进行链接:
gcc -shared -o testlib.so testlib.o
    

要回复问题请先登录注册