Почему 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,

Другие вопросы по тегам