LD_PRELOAD не выполняет предварительную загрузку всех символов

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


person pythonic    schedule 25.06.2012    source источник
comment
Как вы узнали, что clone не загружается предварительно? Как вы определили, что другие предварительно загружаются?   -  person Thomas M. DuBuisson    schedule 25.06.2012
comment
Я поместил printf в свою версию LD_PRELOADed.   -  person pythonic    schedule 25.06.2012
comment
Обратите внимание, что GCC (не)полезен, и как часть его процессов оптимизации он заменяет несколько вызовов функций на другие (например, printf() с константной строкой приводит к puts()). Поэтому убедитесь, что ваши символы такие, какими вы их ожидаете!   -  person    schedule 25.06.2012
comment
strace показывает системные вызовы, которые, на самом деле, отличаются от вызова оболочки C, которую вы пытаетесь заменить. Вы можете проверить адрес clone() и сравнить его с /proc/<pid>/maps, чтобы точно определить, какая библиотека используется. Возможно, системный вызов не выполняется через функцию-оболочку clone().   -  person FatalError    schedule 25.06.2012


Ответы (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
comment
Что еще более важно, pthread_create не может вызвать clone, поскольку clone находится в пространстве имен, зарезервированном для приложения. - person R.. GitHub STOP HELPING ICE; 25.06.2012