Почему не вызывается конструктор?

Рейтинг: 2Ответов: 1Опубликовано: 21.01.2011

Есть динамически подгружаемая библиотека, написанная на C. В эту библиотеку добавлен конструктор (чтобы обойти вызов JNI_Onload). Проблема в том, что конструктор не вызывается. Код очень простой:

int flag = 0;

__attribute__((constructor)) 
void before() {
    flag = 1;
}

// Остальной код библиотеки
// Проверка значения флага flag на равенство 1

В то же время, практически такой же код для простого исполняемого файла работает.

#include <stdio.h>

__attribute__((constructor)) 
void before() {
    printf("Hello!\n");
}

void main() {
}

В чем может быть проблема?

Ответы

▲ 3Принят

Согласно:

Shared libraries must not be compiled with the gcc arguments -nostartfiles'' or-nostdlib''. If those arguments are used, the constructor/destructor routines will not be executed (unless special measures are taken).

Если библиотека подгружает JNI, возможно, там выставлены запрещающие флаги. Кроме того, чтобы конструктор и деструктор отрабатывали правильно в elf-файле должно быть наличие секций .ctor и .dtor. Это можно проверить с помощью команды objdump -h libsomething.so.