У меня есть общая библиотека libmylib.so
, в которой используется libstdc++.so
. Есть еще одна общая библиотека, которая содержит символы с теми же именами, что и символы libstdc++.so
. Имя библиотеки libmystd.so
Сначала загружается libmystd.so
, а затем я использую dlopen
, чтобы открыть libmylib.so
Проблема в том, что символы загружаются из libmystd.so
вместо libstdc++.so
. Как я могу сказать dlopen
сначала искать символы в libstdc++.so
вместо libmystd.so
Вот как я открываю libmylib.so
с помощью dlopen
myHandle = dlopen("libmylib.so", RTLD_GLOBAL | RTLD_NOW)
Затем я вызываю функцию из этой общей библиотеки, но она падает, потому что деструктор std::vercotr
вызывается из libmystd.so
вместо libstdc++.so
0xedb4e936 _ZNSt6vectorISsSaISsEED2Ev + 76 libmystd.so
0xeb9494ff _ZN10MySymbolESs + 1db libmylib.so
dlopen(filename, mode)
и, вероятно, последующегоdlsym(handle, name)
, проблема была бы яснее. - person Ripi2   schedule 09.07.2018dlopen
иdlsym
все должно быть в порядке Не совсем так. Даже если вы каким-то образом можете управлять прямыми вызовами с помощьюdlsym
(как вы собираетесь определять искаженное имя, используемое компоновщиком?), вы не можете контролировать, что делает код в этих вызовах. В этом случае, если вы вызываетеlibstdc++.so
, используяdlsym()
, код, который вы вызываете, вполне может закончиться использованием символов изlibmystd.so
. И удачи, если вы используете шаблоны... - person Andrew Henle   schedule 09.07.2018LD_PRELOAD
? - person Jesper Juhl   schedule 09.07.2018