В моей разделяемой библиотеке мне нужно выполнить определенную инициализацию во время загрузки. Если я определяю функцию с атрибутом 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 ()
, он будет работать.