2012-06-25 4 views
2

Я пытаюсь функции LD_PRELOAD такие как mmap, read, open, clone и т.д ..., но в то время как некоторые функции действительно получают LD_PRELOADed успешно, а другие нет. Например, mmap, read и open отлично подготовлены, но clone нет, хотя я точно знаю clone вызывается из моей программы, как сообщается strace, так как я использую pthreads. В чем причина того, что clone не является LD_PRELOADed здесь?LD_PRELOAD не поджимать все символы

+0

Как вы обнаружили, что 'clone' не предварительно загружается? Как вы определили, что другие предварительно загружены? –

+0

Я положил printf внутри моей версии LD_PRELOADed. – pythonic

+0

Обратите внимание, что GCC является (un) полезным, и как часть его процессов оптимизации он изменяет несколько вызовов функций другим (например, printf() с постоянной строкой приводит к puts()). Поэтому убедитесь, что ваши символы - это те, которые вы бы хотели! –

ответ

1

straceсистемные вызовы; LD_PRELOAD переопределяет (библиотека C) функции. Это, вероятно, указывает на то, что системный вызов clone вызывается другой функцией, не проходя через функциональный символ clone (например, через внутреннюю связь внутри библиотеки C или напрямую вызывающий системный вызов).

Действительно, clone не является библиотечной функцией Posix; это деталь реализации Linux, которая, как представляется, подвергается воздействию. На странице руководства написано:

Вызовы clone

Вместо этого вы должны LD_PRELOAD-переопределить pthread_create и т.д .; на других платформах они могут быть реализованы без clone.

+0

Что еще более важно, 'pthread_create' ** не может ** вызывать' clone', потому что 'clone' находится в пространстве имен, зарезервированном для приложения. –

 Смежные вопросы

  • Нет связанных вопросов^_^