Конструктор разделяемой библиотеки не работает

В моей разделяемой библиотеке мне нужно выполнить определенную инициализацию во время загрузки. Если я определяю функцию с атрибутом GCC __ attribute__ ((constructor)) , она не работает, т.е. она не вызывается, когда загружается программа, связывающая мою разделяемую библиотеку.

Если я изменю имя функции на _init () , она заработает. Очевидно, использование функций _init () и _fini () в настоящее время не рекомендуется .

Есть идеи, почему __ attribute__ ((constructor)) не работает? Это для Linux 2.6.9, gcc версия 3.4.6

Изменить:

Например, допустим, код библиотеки следующий:

#include 

int smlib_count;

void __attribute__ ((constructor)) setup(void) {
    smlib_count = 100;
    printf("smlib_count starting at %d\n", smlib_count);
}

void smlib_count_incr() {
    smlib_count++;
    smlib_count++;
}

int smlib_count_get() {
    return smlib_count;
}

Для сборки. следующее:

gcc -fPIC -c smlib.c
ld -shared -soname libsmlib.so.1 -o libsmlib.so.1.0 -lc smlib.o
ldconfig -v -n .
ln -sf libsmlib.so.1 libsmlib.so

Поскольку .so не находится в одном из стандартных мест, я обновляю LD_LIBRARY_PATH и связываю .so из другой программы. Конструктор не вызывается. Если я изменю его на _init () , он будет работать.

10
задан Dan Fego 9 March 2012 в 19:38
поделиться