Конструктор общей библиотеки не запущен

У меня следующая проблема. Я пишу общую библиотеку

#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 testlib.c -shared -Wl, -soname, libtest.so -o libtest.so

работает !!!

8
задан rd478qx 13 April 2011 в 09:05
поделиться