Я пытаюсь использовать функции LD_PRELOAD, такие как mmap
, read
, open
, clone
и т. д...., но в то время как некоторые функции успешно получают LD_PRELOAD, другие нет. Например, mmap
, read
и open
прекрасно предварительно загружаются, а clone
нет, в то время как я точно знаю, что clone
вызывается из моей программы, как сообщает strace
, так как я использую pthreads. В чем причина того, что clone
здесь не LD_PRELOAD?
LD_PRELOAD не выполняет предварительную загрузку всех символов
Ответы (1)
strace
показывает системные вызовы; LD_PRELOAD переопределяет (библиотека C) функции. Вероятно, это указывает на то, что системный вызов clone
вызывается другой функцией, не проходя через символ функции clone
(например, через внутреннюю связь внутри библиотеки C или прямой вызов системного вызова).
Действительно, clone
не является библиотечной функцией Posix; это деталь реализации Linux, которая оказалась раскрытой. На странице руководства говорится:
Вызовы clone() и sys_clone специфичны для Linux и не должны использоваться в программах, предназначенных для переноса.
Вместо этого вы должны LD_PRELOAD-override pthread_create
и т.д.; на других платформах они могут быть реализованы без clone
.
person
ecatmur
schedule
25.06.2012
Что еще более важно,
pthread_create
не может вызвать clone
, поскольку clone
находится в пространстве имен, зарезервированном для приложения.
- person R.. GitHub STOP HELPING ICE; 25.06.2012
clone
не загружается предварительно? Как вы определили, что другие предварительно загружаются? - person Thomas M. DuBuisson   schedule 25.06.2012strace
показывает системные вызовы, которые, на самом деле, отличаются от вызова оболочки C, которую вы пытаетесь заменить. Вы можете проверить адресclone()
и сравнить его с/proc/<pid>/maps
, чтобы точно определить, какая библиотека используется. Возможно, системный вызов не выполняется через функцию-оболочкуclone()
. - person FatalError   schedule 25.06.2012