dlopen: можно ли поймать неразрешенные символы, «вручную» разрешая их по мере их появления? - PullRequest
4 голосов
/ 19 августа 2011

Можно ли перехватывать неразрешенные ссылки на символы, когда они происходят, чтобы вызывать функцию, чтобы попытаться разрешить символ по мере необходимости?Или возможно добавить новые символы в динамическую таблицу символов во время выполнения, не создавая файл библиотеки и не распаковывая его?Я нахожусь на GNU / Linux, используя GCC.(Переносимость к другим Unix-системам была бы хорошей, но это не ключевой вопрос.)

Заранее спасибо!

Редактировать: Я должен был дать более подробную информацию о том, что япытаюсь сделать.Я хочу написать интерпретатор для языка программирования, который должен поддерживать как скомпилированные (dlopen'ed), так и интерпретируемые модули.Я хотел, чтобы вызовы от скомпилированного модуля к функциям, определенным в другом месте, были разрешены компоновщиком, чтобы избежать поиска функции при каждом вызове, но вызовы интерпретируемого кода оставались бы нерешенными.Я хотел перехватить эти вызовы, чтобы при необходимости вызывать соответствующую интерпретируемую функцию (или сигнализировать об ошибке, если функция не существует).

Ответы [ 2 ]

2 голосов
/ 19 августа 2011

Я делаю дикое предположение, что проблема, которую вы пытаетесь решить, - это случай, когда вы dlopen начинаете использовать загружаемый модуль, а затем внезапно зависаете из-за неразрешенных символов. Если это так, то это результат отложенного связывания , и вы можете отключить его, экспортировав LD_BIND_NOW=1 (или любое значение, если оно установлено) в среду. Это гарантирует, что все символы могут быть разрешены до возврата dlopen, а если нет, операция dlopen завершится неудачно, что позволит вам корректно обработать ситуацию.

2 голосов
/ 19 августа 2011

Если вы знаете, какие символы отсутствуют, вы можете написать библиотеку только с ними, и LD_PRELOAD это до выполнения приложения.

Если у вас нет списка символов, которые отсутствуют,вы можете обнаружить их, используя 'nm' или 'objdump' в двоичном файле, и, основываясь на этом, написать сценарий, который соберет библиотеку с отсутствующими символами до выполнения приложения, а затем также LD_PRELOAD.

Кроме того, вы можете использовать gdb для добавления нового «кода» в приложения, заставляя функции указывать на то, что вам нужно.

Наконец, вы также можете переопределить некоторые функции ld.so дляобнаруживать пропущенные символы и что-то с ними делать.

Но в любом случае, если бы вы могли объяснить, что вы пытаетесь выполнить, было бы легче найти правильное решение.

...