dlopen с двумя общими библиотеками, экспортируя символы

У меня есть совместно использованная библиотека 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, но это кажется мне определенной путаницей.Спасибо.

8
задан mr grumpy 29 July 2010 в 01:46
поделиться

1 ответ

Ссылка 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 .

6
ответ дан 5 December 2019 в 22:15
поделиться
Другие вопросы по тегам:

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