Ответ 1
strace
(домашняя страница, source) содержит таблицы со всем этим материалом ( см. linux/<platform>/syscallent.h
).
Я пишу карту системного вызова Linux для отладчика radare2. Это означает предоставление огромного статического массива, отображающего системный номер вызова, имени имени системы вызовов и количеству аргументов. Это было легко для OpenBSD, так как числа syscall определены в sys/syscall.h, а в комментарии выше каждого указано количество аргументов. Это просто вопрос написания script для синтаксического анализа этого и выкидывания кода C для массива.
Однако на linux у нас нет такой роскоши. Легко получить номер syscall из заголовков ядра, но как мне получить количество аргументов? Единственные мои идеи:
1) Введите их вручную. Для каждой арки (они различаются между арками в linux). Все 300+ проклятых вещей. Ни в коем случае!
2) Разбирайте страницы руководства.
3) Напишите script, который пытается вызывать каждый столбец с 0, 1, 2... args до сборки программы. Не будет работать для varargs, но поддерживают ли syscalls это?
Должен быть лучший способ. Пожалуйста, помогите!
strace
(домашняя страница, source) содержит таблицы со всем этим материалом ( см. linux/<platform>/syscallent.h
).
Единственный список, который я знаю, - это источник ядра, include/linux/syscalls.h. Но это только по имени, а не по числу; Я думаю, вам нужно использовать заголовок syscall.h для вашей конкретной платформы, чтобы получить номера. И в этом файле есть несколько файлов #ifdef...
Разбор документации:
http://asm.sourceforge.net/syscall.html Разбирайте HTML внутри тегов <pre>
.
или
http://syscalls.kernelgrok.com/ Конвертировать JSON http://syscalls.kernelgrok.com/syscalls-2.6.35.4.js
ausyscall - программа, которая позволяет отображать имена и номера системных вызовов
Существуют системные вызовы с переменными числами аргументов - свидетельствуем о вызове open()
на уровне C, где третий параметр является необязательным (может не быть дополнительным на уровне ассемблера).
Лучше всего найти системные вызовы, идентифицированные по имени в syscalls.h
в (предварительно обработанном) источнике других системных заголовков. Из них вы можете подсчитать количество аргументов. Просто получить правильные заголовки на месте может быть сложным, и, возможно, могут быть системные вызовы, которые никогда не отображаются как функции C напрямую (я не смотрел, но это маловероятно).
Вы можете посмотреть, как другой отладчик, такой как GDB, выполняет ту же работу.