LINUX.ORG.RU

[C] конструктор в архиве


0

0

Имеется архив с функцией-конструктором, вызываемой перед main.

void init() __attribute__((constructor));
Линкую с основной программой - функция не вызывается (и ее нет в бинарнике).

Если вызвать ее явно, то вызовется также и перед main.

Если линковать с объектным файлом, то тоже все нормально.

Как вытащить init из архива без явного вызова?

★★★

Ответ на: комментарий от ksv

Да, так

void (*f)() = init;
работает, но только без оптимизации.

К тому же мне хотелось бы, чтобы использование библиотеки было полностью прозрачным, чтобы пишущий основную программу мог вообще ничего о ней не знать.

unsigned ★★★ ()
Ответ на: комментарий от unsigned

Руки отрывать за это. Нормальные люди решают эту задачу так

my_library_init();
.....
my_library_finish();

а когда начинаются всякие платформо-зависимые хаки и неявные вещи, то рано или поздно использующий такую библиотеку поимеет геморрой на свою жопу.

Reset ★★★★★ ()
Ответ на: комментарий от Reset

А необязательно хаки. В плюсах то же можно сделать по стандарту, используя статичные члены класса, а результат тот же. Потому что компилируется в то же самое.

В том и состояла задача - как полностью избавить пользователя от геморроя. my_library_init() забыть еще проще.

unsigned ★★★ ()
Ответ на: комментарий от unsigned

А необязательно хаки.

То что предлагается это и есть хак.

my_library_init() забыть еще проще.

libhandler h = my_library_init();
function1(h, params);
...
my_library_free(h);

этим убъешь сразу двух зайцев

Reset ★★★★★ ()
Ответ на: комментарий от Reset

Добавлять во все функции ненужный параметр - вряд ли упростит жизнь ) К тому же у меня там вообще пока нет функций кроме инициализирующей.

unsigned ★★★ ()
Ответ на: комментарий от alex_custov

Да, но это должен делать пользователь библиотеки. А я хотел добиться, чтобы кроме обычной линковки с библиотекой ничего не было нужно.

В общем, вижу, что хочу невозможного (

unsigned ★★★ ()
Ответ на: комментарий от unsigned

Что меня беспокоит во всем этом - то, что код может работать, а может и нет, в зависимости от того как собрать.

Ладно attribute, но стандартный C++

class Init {
    public:
        Init() { std::cout << "Before main\n"; }
} init;
 
тоже то работает, то нет.

unsigned ★★★ ()
Ответ на: комментарий от unsigned

Инициализация у тебя что делать? Подозреваю, что библиотека в твоем случае будет нереентерабельная со всеми вытекающими последствиями.

Reset ★★★★★ ()
Ответ на: комментарий от Reset

В общем надежного решения не найдено. Ничего лучше my_library_init() все-таки не придумали )

unsigned ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.