Нахождение символа в моем собственном процессе

Вот настройки:

  1. Там есть приложение A что загружает liba.so (связано во время компиляции)
  2. liba.so экспортирует символ expA
  3. Я тоже не контролирую A или же liba.so
  4. Приложение A может загрузить указанную мной библиотеку, libmine.soв тот же процесс через dlopen (думаю, плагин архитектуры)
  5. Мне нужно использовать expA от libmine.so но не знаю, как найти его без явной ссылки на liba.soчто я и делал до сих пор. Я предполагаю, что это не будет работать в реальном мире, так как этот символ не гарантированно будет находиться по тому же адресу, что и в моей локальной копии liba.so (либо это?). libmine.so будет закрытым исходным кодом и не может быть перекомпилирован с A,

Я никогда не делал ничего подобного, поэтому немного неясен в деталях загрузки библиотеки. Например, если я попытаюсь dlopen("liba.so") изнутри libmine.soя получу дескриптор к уже загруженной библиотеке или новой копии?

С точки зрения того, как libmine.so все, что я знаю, это то, что он будет загружен RTLD_LAZY (и ничего больше).

Любая помощь и указатели будут с благодарностью!

1 ответ

Решение

Если все liba.so библиотека dlopenЭд, используя RTLD_GLOBALтогда вы можете использовать dlsym(RTLD_DEFAULT, "expA") чтобы найти символ без необходимости заново открывать библиотеку.

Если liba.so библиотека dlopenЭд, используя RTLD_LOCAL тогда вам нужно будет получить дескриптор библиотеки с помощью dlopen снова в вашем собственном libmine.so, Обратите внимание на следующее:

Если та же библиотека загружается снова с помощью dlopen(), возвращается тот же дескриптор файла. Библиотека dl поддерживает количество ссылок для дескрипторов библиотеки, поэтому динамическая библиотека не освобождается до тех пор, пока dlclose() не будет вызвана для нее столько раз, сколько dlopen () преуспел в ней. Процедура _init(), если она есть, вызывается только один раз. Но последующий вызов с RTLD_NOW может вызвать разрешение символов для библиотеки, ранее загруженной с RTLD_LAZY.

то есть это та же самая копия библиотеки.

механизм (псевдо), предполагая, что expA является функцией: int expA(int value):

int (*fpointer)(int) = NULL;

void *handle = dlopen("liba.so", RTLD_LAZY | RTLD_LOCAL);
if (handle != NULL) {
    void *symbol = dlsym(handle, "expA");
    if (symbol != NULL) {
        fpointer = (int (*)(int ))symbol;
    }
}

Это псевдокод, практически без ошибок.

Другие вопросы по тегам