Я пытаюсь использовать функции LD_PRELOAD, такие как mmap
, read
, open
, clone
и т. Д., Но в то время как некоторые функции успешно получают LD_PRELOAD, другие - нет. Например, mmap
, read
и open
отлично предварительно загружаются, а clone
- нет, хотя я точно знаю, что clone
вызывается из моей программы, как сообщалось автор: strace
, поскольку я использую pthreads. В чем причина того, что clone
не указан здесь в LD_PRELOAD?
1 ответ
strace
показывает системные вызовы ; LD_PRELOAD переопределяет (библиотека C) функции . Это, вероятно, указывает на то, что системный вызов clone
вызывается другой функцией, без прохождения через символ функции clone
(например, посредством внутренней связи внутри библиотеки C или прямого вызова системного вызова).
В самом деле, clone
не является библиотечной функцией Posix; это деталь реализации Linux, которая оказывается раскрытой. На странице руководства говорится:
Вызовы clone () и sys_clone специфичны для Linux и не должны использоваться в программах, предназначенных для переносимости.
Вместо этого вам следует LD_PRELOAD-override pthread_create
и т.д .; на других платформах они могут быть реализованы без clone
.
pthread_create
не может вызвать clone
, потому что clone
находится в пространстве имен, зарезервированном для приложения.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
clone
не загружается предварительно? Как вы определили, что остальные загружаются предварительно?strace
показывает системные вызовы - которые afaik отличаются от вызова C оболочки , которую вы пытаетесь заменить. Вы можете проверить адресclone()
и сравнить его с/proc/<pid>/maps
, чтобы точно узнать, какая библиотека используется. Возможно, системный вызов не выполняется через функцию-оболочкуclone()
.