LINUX.ORG.RU

SIGSEGV при использовании плюсового кода в .so библиотеке


0

1

привет.

реализовал в библиотеке init-функцию:

extern "C" {

void __attribute__ ((constructor)) my_init(void) {
	//std::cout << "constructor" << std::endl;
	//printf("constructor\n");
}

} // extern "C"
библиотеку подгружаю как: LD_PRELOAD=lib.so ./appname

если раскомментировать первую строку - SIGSEGV, если вторую - ок.

скажите, от чего так?

благодарен.

★★★

Последнее исправление: niXman (всего исправлений: 1)

extern «C» is meant to be recognized by a C++ compiler and to notify the compiler that the noted function is (or to be) compiled in C style.

Где в C операторы «<<» в контексте вывода? Ты пытаешься сдвинуть std::cout на *«constructor» бит влево.

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

ох и ступил, эта функция ведь обозначена как: extern «C»

спасибо, вопрос закрыт.

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

«C style» относится только к декорированию имён, а сегфолт происходит, оттого что глобальный объект std::cout ещё не проинициализирован.

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

оттого что глобальный объект std::cout ещё не проинициализирован.

А проинициализировать можно попробовать, перед кодом:

static  std::ios_base::Init initializer;

i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

а теперь запутался %) так в чем же причина?

std::cout - глобальный статический. по логике, он инициализируется при загрузке libstdc++*.so которая, в свою очередь, загружается после этой хуковой библиотеки. если я снова ничего не напутал, то вы правы.

т.е. вариантов решения я вижу два: 1)линковать хуковую библиотеку со статическими зависимостями, 2) не использовать плюсовые cin/cout/cerr.

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

при попытке слинковать хуковую библиотеку со статической libstdc++, получаю это:

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.a(compatibility.o): relocation R_X86_64_32 against `_ZTIN10__cxxabiv115__forced_unwindE' can not be used when making a shared object; recompile with -fPIC
/usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.a: could not read symbols: Bad value

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