Как я могу внедрить фоновый поток в приложение с помощью LD_PRELOAD?

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

Например, я думаю, что контрольная точка / перезапуск лаборатории Беркли использует этот метод для добавления фонового потока в приложение, которое может быть проверено позже.

Итак, теперь вопрос в том, как можно внедрить поток в скомпилированное приложение с помощью LD_PRELOAD, не зная заранее, какие функции общих библиотек вызываются из этого приложения?


person hebbo    schedule 18.02.2014    source источник
comment
Я считаю, что существует множество функций, которые, если они есть, будут автоматически вызываться при загрузке библиотеки. Вы, вероятно, найдете это в документации к динамическому компоновщику.   -  person Chris Stratton    schedule 19.02.2014
comment
Может быть полезно: stackoverflow.com/questions/ 2053029 /   -  person Zan Lynx    schedule 19.02.2014


Ответы (1)


Это достаточно простой вопрос - вы можете реализовать функцию _init - это будет void _init (void) {}, и вы можете использовать в ней pthread_create (при условии, что вы связали свою библиотеку с помощью -lpthread). Вам следует скомпилировать свою библиотеку с другими необходимыми зависимостями -l. GCC позволит вам заменить жестко запрограммированный _init () другой точкой входа, также указанной с помощью __attribute (конструктора). В любом случае, ваша точка входа будет вызвана LD.

Когда ваша библиотека вводится, она вводится раньше всех остальных, но ее собственные зависимости также разрешаются, поэтому любые вызовы, которые вы делаете, обычно в порядке (одно заметное исключение - если вы перехватываете функции, которые вы вызываете позже, для чего вам понадобится для безопасного использования API-интерфейсов dlfcn).

person Technologeeks    schedule 18.02.2014