Я пытаюсь функции LD_PRELOAD такие как mmap
, read
, open
, clone
и т.д ..., но в то время как некоторые функции действительно получают LD_PRELOADed успешно, а другие нет. Например, mmap
, read
и open
отлично подготовлены, но clone
нет, хотя я точно знаю clone
вызывается из моей программы, как сообщается strace
, так как я использую pthreads. В чем причина того, что clone
не является LD_PRELOADed здесь?LD_PRELOAD не поджимать все символы
ответ
strace
системные вызовы; LD_PRELOAD переопределяет (библиотека C) функции. Это, вероятно, указывает на то, что системный вызов clone
вызывается другой функцией, не проходя через функциональный символ clone
(например, через внутреннюю связь внутри библиотеки C или напрямую вызывающий системный вызов).
Действительно, clone
не является библиотечной функцией Posix; это деталь реализации Linux, которая, как представляется, подвергается воздействию. На странице руководства написано:
Вызовы clone
Вместо этого вы должны LD_PRELOAD-переопределить pthread_create
и т.д .; на других платформах они могут быть реализованы без clone
.
Что еще более важно, 'pthread_create' ** не может ** вызывать' clone', потому что 'clone' находится в пространстве имен, зарезервированном для приложения. –
Как вы обнаружили, что 'clone' не предварительно загружается? Как вы определили, что другие предварительно загружены? –
Я положил printf внутри моей версии LD_PRELOADed. – pythonic
Обратите внимание, что GCC является (un) полезным, и как часть его процессов оптимизации он изменяет несколько вызовов функций другим (например, printf() с постоянной строкой приводит к puts()). Поэтому убедитесь, что ваши символы - это те, которые вы бы хотели! –