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

2
pythonic 25 Июн 2012 в 19:43
Как вы узнали, что clone не загружается предварительно? Как вы определили, что остальные загружаются предварительно?
 – 
Thomas M. DuBuisson
25 Июн 2012 в 19:46
Я поместил printf в свою версию LD_PRELOADed.
 – 
pythonic
25 Июн 2012 в 19:47
Обратите внимание, что GCC (не) полезен, и как часть своих процессов оптимизации он меняет несколько вызовов функций на другие (например, printf () 'ing с постоянной строкой приводит к put ()). Так что убедитесь, что ваши символы такие, какими вы хотели бы быть!
 – 
user529758
25 Июн 2012 в 19:48
strace показывает системные вызовы - которые afaik отличаются от вызова C оболочки , которую вы пытаетесь заменить. Вы можете проверить адрес clone() и сравнить его с /proc/<pid>/maps, чтобы точно узнать, какая библиотека используется. Возможно, системный вызов не выполняется через функцию-оболочку clone().
 – 
FatalError
25 Июн 2012 в 20:03

1 ответ

Лучший ответ

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

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

Вызовы clone () и sys_clone специфичны для Linux и не должны использоваться в программах, предназначенных для переносимости.

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

1
ecatmur 25 Июн 2012 в 20:35
Что еще более важно, pthread_create не может вызвать clone, потому что clone находится в пространстве имен, зарезервированном для приложения.
 – 
R.. GitHub STOP HELPING ICE
25 Июн 2012 в 20:46