Сообщите dlopen, в какой библиотеке искать символы в первую очередь

У меня есть общая библиотека 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

person Morad    schedule 09.07.2018    source источник
comment
Вы действительно пытаетесь запустить процесс с двумя разными версиями библиотек времени выполнения C++ одновременно?   -  person Andrew Henle    schedule 09.07.2018
comment
@AndrewHenle можно ли этого добиться?   -  person Morad    schedule 09.07.2018
comment
Если бы вы показали код с использованием dlopen(filename, mode) и, вероятно, последующего dlsym(handle, name), проблема была бы яснее.   -  person Ripi2    schedule 09.07.2018
comment
@Ripi2 Я добавил код dlopen   -  person Morad    schedule 09.07.2018
comment
@Tyker но с dlopen и dlsym все должно быть в порядке Не совсем так. Даже если вы каким-то образом можете управлять прямыми вызовами с помощью dlsym (как вы собираетесь определять искаженное имя, используемое компоновщиком?), вы не можете контролировать, что делает код в этих вызовах. В этом случае, если вы вызываете libstdc++.so, используя dlsym(), код, который вы вызываете, вполне может закончиться использованием символов из libmystd.so. И удачи, если вы используете шаблоны...   -  person Andrew Henle    schedule 09.07.2018
comment
Возможно, вы ищете LD_PRELOAD?   -  person Jesper Juhl    schedule 09.07.2018


Ответы (1)


Как я могу указать dlopen сначала искать символы в libstdc++.so вместо libmystd.so

Вы можете сначала загрузить libstdc++.so, и тогда его символы «выиграют».

Предположительно, это проблема для вас, потому что вы хотите, чтобы какой-то другой код использовал libmystd.so вместо libstdc++.so.

На самом деле невозможно безопасно смешать два отдельных экземпляра среды выполнения C++ в одном процессе. Любой подход, который покажется работающим, будет иметь скрытые подводные камни и на самом деле не будет работать (и отладка этого будет болезненной).

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

person Employed Russian    schedule 14.07.2018
comment
В конце концов я использовал 2 отдельных процесса - person Morad; 16.07.2018