У меня есть совместно использованная библиотека Linux, foo.so, который загружается из исполняемого использования dlopen("foo.so", RTLD_NOW | RTLD_LOCAL)
. От foo.so я хотел бы к dlopen другую библиотеку, bar.so, который ссылочные символы, определенные в foo.so, но компоновщику не удается найти их. Я не могу изменить RTLD_LOCAL на RTLD_GLOBAL, потому что у меня нет источника к исполняемому файлу, делающему загрузку. Я думал -Wl,--export-dynamic
когда соединение foo.so могло бы помочь, но оно не переопределяет локальный флаг к dlopen. Новая функция видимости атрибута GCC не похожа, она предлагает ответ также.
Существует ли способ, которым я могу дать компоновщику команду разрешать ссылки на неопределенные символы в bar.so к тем определениям в foo.so, не связывая панель с-lfoo или подобием, перемещающим символы в 3-ю библиотеку и связывающим и нечто и панель против него? Единственная вещь, которая происходит со мной, к dlopen foo.so с RTLD_GLOBAL из самого foo.so, затем dlopen bar.so, но это кажется мне определенной путаницей.Спасибо.
Ссылка foo.so
на bar.so
.
Когда исполняемый файл dlopen ()
s foo.so
, bar.so
также будет загружен.
В качестве альтернативы можно выполнить двоичное исправление исполняемого файла, чтобы добавить RTLD_GLOBAL
к флагам для вызова dlopen ()
. Код будет выглядеть примерно так:
movl $2, 4(%esp) # $2 == RTLD_NOW; RTLD_LOCAL is 0
movl $0xNNNNN, (%esp) # $0xNNNNN == &"foo.so"
call dlopen
Подключите его к movl $ 0x102, 4 (% esp)
вместо ( RTLD_GLOBAL == 0x100
) и вуаля.
РЕДАКТИРОВАТЬ:
Если вам известно имя bar.so
, то вы можете связать foo.so
с «заглушкой» bar.so
. Неважно, что у вас нет «настоящего» bar.so
; важно только то, что foo.so
зависит от него. Во время выполнения эта зависимость вызовет загрузку bar.so
всякий раз, когда загружается foo.so
.