170 похожих чатов

Подскажите пожалуйста, как с помощью g++ скомпилить shared библиотеку (.so)

?
#include <iostream>

extern "C" void _init(){
std::cout << "init called" << std::endl;
}
>g++ -shared -o libtest.so -fPIC main.cpp
говорит про переопределение _init()
но ведь мне нужен _init, чтобы его вызвал dlopen() (в целом там предусмотрена некоторая инициализация)
Как быть?

10 ответов

31 просмотр

Это весь код?

\--- Автор вопроса
Дмитрий 🎮
Это весь код?

main.cpp:(.text+0x0): повторне визначення «_init»; /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../lib/crti.o:(.init+0x0): тут визначено вперше

Дмитро Цимбалюк
main.cpp:(.text+0x0): повторне визначення «_init»;...

Значит так, как ты сделал, делать нельзя и нужно внимательно читать, как подобную либы делать с такой функцией. При этих ключах сьорки твоя функция уже определена в crti.

Как вариант, если так сильно нужно именно _init создать, можно функцию объявить как void _init() asm("_init"); void _init() { ... } И скомпилировать без стандартной библиотеки. Но это очень сильно усложнит тебе жизнь.

\--- Автор вопроса
\--
да, то самое

>__attribute__((constructor)) #include <iostream> extern "C" void _init() __attribute__((constructor)); extern "C" void _init(){ std::cout << "init called" << std::endl; } это не решает проблему. Всё таже ошибка - multiple definition of `_init'; /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../lib/crti.o:(.init+0x0): first defined here >По соглашению вызовов Си, функция init в 32 битной программе станет _init. я компилю в x64. Если я переименовываю функцию в init (оно компилится тогда), всё равно есть экспорт функции _init. И я так понимаю она и вызовется dlopen. Я немного перефразирую вопрос. Как мне выполнить код при загрузке библиотеки? Желательно без отключения CRT

\--
>__attribute__((constructor)) #include <iostream> ...

Ну так функцию переименуй теперь

\--
>__attribute__((constructor)) #include <iostream> ...

При загрузке динамической библиотеки - средствами ОС, при загрузке статических Библ. -никак

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта