Инъекция кода в библиотеку Linux и вызовы функций с одинаковыми именами в SO - PullRequest
1 голос
/ 03 марта 2012

Я создал общий объект linux, который внедряю в стороннюю программу для перехвата некоторых динамических вызовов функций с помощью LD_PRELOAD.

Сторонняя программа использует SO "libabc.so", расположенный по некоторому пути. Мой внедренный SO использует другой SO, также называемый "libabc.so", расположенный по другому пути (по сути, идентичные, но небольшие различия в коде).

Моя проблема сейчас в том, что вызовы функции «def», которые появляются в обоих libabc.so, всегда решаются первым. (Предположительно, потому что он загружается первым ?!) Как я могу решить их с помощью второго libabc.so?

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

Если вы хотите использовать только одну libabc.so версию, вы всегда можете использовать LD_PRELOAD, чтобы загрузить ее вместе со своим собственным общим объектом, прежде чем что-либо еще.

Если вы хотитечтобы использовать несколько версий, у вас есть несколько альтернатив:

  • Используйте dlopen() в вашем общем объекте для загрузки этой библиотеки.Поскольку вы создали объект инъекции функции, вы должны быть знакомы с этой процедурой.Это более общий и мощный способ - вы даже можете смешивать и сопоставлять функции из разных версий библиотеки.

  • Используйте другую DT_SONAME для версии библиотеки, с которой связывается ваш общий объект.К сожалению, для этого требуется (немного) изменить систему сборки этой библиотеки и перекомпилировать.

  • Статически связать ваш общий объект с рассматриваемой библиотекой.Не всегда возможно, но это не требует изменения рассматриваемой библиотеки.Основная проблема этой альтернативы заключается в том, что любое изменение в библиотеке должно сопровождаться перекомпоновкой вашего общего объекта для внесения изменений.

    Предупреждение: вам может понадобиться использовать специальный сценарий компоновщика или специальныйопции компоновщика, чтобы избежать конфликтов символов.

2 голосов
/ 03 марта 2012

Если что-то не изменилось с тех пор, как я это делал, вам потребуется dlopen () библиотека, в которую вы хотите передавать вызовы и вызывать функцию вручную, что-то вроде;

handle = dlopen("/path/to/libabc.so", RTLD_LAZY);
otherDef = dlsym(handle, "def");
orderDef(parameter);

Полный пример того, как это сделать, можно найти на LinuxJournal .

...