Почему strace не использует тестовые системные вызовы, чтобы узнать их индексы в таблице системных вызовов?
Я это понимаю strace
команда использует ptrace(PTRACE_PEEKUSER, child, __builtin_offsetof(struct user, regs.orig_eax))
чтобы найти индекс системного вызова, в который попадает дочерний объект. Затем, чтобы перевести индекс в имя функции syscall, он построил таблицы, сделанные на основе поиска заголовков исходного кода linux, присутствующих в установке.
Этот метод должен быть недокументированным и склонным к сбою, поскольку местоположение и синтаксис объявлений исходного кода не документированы, должны быть найдены с помощью grepping и могут изменяться неизвестными способами. Я правильно сказал это?
Если это так, то почему бы strace
Не использовать следующий метод, как мне кажется, проще, опирается только на документацию и, таким образом, является надежным.
В начале первого запуска после перезагрузки strace
отправляет тестовый системный вызов, по одному для каждой функции системного вызова, перехватывает его и наблюдает, какой индекс системного вызова использует дочерний элемент. Это дает полную и правильную пользовательскую таблицу, которая может быть сохранена в файле, известном для дальнейших вызовов strace
,
Я уверен, что этот метод должен быть рассмотрен, так как он не является чем-то особенно гениальным. Так что должно быть что-то не так с этим. Что случилось??
1 ответ
Потому что не существует понятия имени системного вызова на этом низком уровне. Выхода нет strace
мог бы сказать "Эй, давайте сделаем fcntl()
позвоните и посмотрите, что это за номер!". Он может выполнять вызовы только на основе номеров системных вызовов. Это происходит потому, что системный вызов выполняется, когда номер системного вызова сохраняется в eax
или же rax
зарегистрироваться, и процесс вызывает int 0x80
или же syscall
,