Android NDK - загрузка символа только основной DLL \ SO из dlsym () - PullRequest
0 голосов
/ 23 января 2019

Используя Android NDK и сгенерированными библиотеками (.so)

Мне нужно получить адрес метода, который присутствует только в основном SO.Использование dlsym() после dlopen() предоставит адрес метода, но он будет искать этот метод во всех связанных SO.Но мне нужно получить адрес метода, только если этот метод является частью основного SO, а НЕ, если он является частью любого другого связанного SO.

Например, если я открыл A.so с использованием dlopen() и затем вызовите dlsym() для проверки функции foo(), используя дескриптор, предоставленный dlopen(), тогда я должен получить дескриптор, только если он является частью A.so.в настоящее время dlsym() предоставляет адрес, даже если foo() является частью B.so, который связан с A.so (мне нужен dlsym() для поиска только в A.so, а не в других связанных или зависимых библиотеках),

В Linux, если мы используем dlopen() с флагом 'RTLD_FIRST', желаемое поведение может быть достигнуто.Но «RTLD_FIRST» не поддерживается в Android.Я проверил заголовочный файл 'dlfcn.h' для макроса 'RTLD_FIRST' и отсутствует.

Если это полностью невозможно в Android-NDK, то можем ли мы каким-то образом получить имя SOв котором метод присутствует.В приведенном выше примере, если я могу понять, что foo() является частью B.so, я могу выполнить простую проверку, чтобы определить, находится ли он в нужной библиотеке.

Код написан на языке C.Может кто-нибудь, пожалуйста, дайте мне знать, как это может быть достигнуто?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Для тех, кто хочет знать, как я добился желаемых результатов.Поскольку RTLD_LOCAL и другие связанные флаги не давали желаемых результатов, получите адрес метода с помощью dlsym() и передайте этот адрес на dladdr(const void* __addr, Dl_info* __info).dladdr() возвращает адекватные детали метода в Dl_info, по крайней мере, то, что я хотел.Указатель Dl_info->dli_fname содержит полный путь к DLL / библиотеке, в которой был найден метод.

0 голосов
/ 24 января 2019

Согласно https://linux.die.net/man/3/dlsym

RTLD_LOCAL

Это обратное значение RTLD_GLOBAL и значение по умолчанию, если ни один из флагов не установленуказано.Символы, определенные в этой библиотеке, не доступны для разрешения ссылок в последующих загруженных библиотеках.

Попробуйте использовать флаг RTLD_LOCAL в dlopen().

...