Функция dlsym () возвращает неправильный адрес функции (в разделе заглушек MIPS другой библиотеки)

Я занимаюсь разработкой разделяемой библиотеки (.so), которую можно загрузить как плагин в другую программу. Эта программа состоит из множества других библиотек. Одна из библиотек которой, пусть она будет называться libA.so, экспортирует собственные реализации :: operator new () и :: operator delete (). Но я не хочу использовать эту реализацию new и delete, а также использовать собственную реализацию (статически связанную с моей библиотекой). Все работает нормально, но в libA.so есть функция, которая возвращает указатель на выделенную память, и я должен освободить ее с помощью вызова оператора delete из libA.so. Итак, мне нужен адрес символа _ZdlPv из libA.so.

Я использую функцию dlsym для получения адреса _ZdlPv: dlsym (RTLD_DEFAULT, «_ZdlPv»). Моя собственная реализация оператора delete (символ _ZdlPv) отсутствует в таблице динамических символов в моей общей библиотеке, поэтому я ожидаю получить адрес оператора delete (), определенный в libA.so.

Но я получил совершенно неверный результат от функции dlsym — она ​​возвращает адрес, который находится внутри другой библиотеки libB.so. И libB.so не содержит определения символа _ZdlPv, но он требует этот символ (он не определен в этой библиотеке). И адрес, возвращаемый dlsym (), указывает на раздел .MIPS.stubs в libB.so. Похоже, это что-то вроде PLT (но на архитектуре MIPS — да, я разрабатываю для MIPS). И когда я вызываю функцию с адресом, возвращаемым dlsym — поток завершается. Трудно отлаживать …

Что здесь не так? Почему у меня не работает dlsym ()? Как я знаю, регистры $ gp содержат указатель на «таблицу глобальных связей». У каждой общей библиотеки есть своя таблица связей? И вызывая функцию из секции заглушек, gp должен иметь правильное значение — верно? И когда я вызываю код из секции заглушек другой библиотеки (libB.so) — я вызываю его с неправильным значением $ gp, из-за этого потока происходит сбой?

Но почему dlsym () возвращает указатель на код в разделе заглушек другой библиотеки (libB.so)? Это потому, что секция заглушек моей библиотеки не содержит символа _ZdlPv, потому что ее нет в динамической таблице символов моей библиотеки?

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

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector