Подтвердить что ты не робот

Как я могу получить список системных вызовов Linux и количество аргументов, которые они автоматически принимают?

Я пишу карту системного вызова Linux для отладчика radare2. Это означает предоставление огромного статического массива, отображающего системный номер вызова, имени имени системы вызовов и количеству аргументов. Это было легко для OpenBSD, так как числа syscall определены в sys/syscall.h, а в комментарии выше каждого указано количество аргументов. Это просто вопрос написания script для синтаксического анализа этого и выкидывания кода C для массива.

Однако на linux у нас нет такой роскоши. Легко получить номер syscall из заголовков ядра, но как мне получить количество аргументов? Единственные мои идеи:

1) Введите их вручную. Для каждой арки (они различаются между арками в linux). Все 300+ проклятых вещей. Ни в коем случае!

2) Разбирайте страницы руководства.

3) Напишите script, который пытается вызывать каждый столбец с 0, 1, 2... args до сборки программы. Не будет работать для varargs, но поддерживают ли syscalls это?

Должен быть лучший способ. Пожалуйста, помогите!

4b9b3361

Ответ 2

Единственный список, который я знаю, - это источник ядра, include/linux/syscalls.h. Но это только по имени, а не по числу; Я думаю, вам нужно использовать заголовок syscall.h для вашей конкретной платформы, чтобы получить номера. И в этом файле есть несколько файлов #ifdef...

Ответ 4

ausyscall - программа, которая позволяет отображать имена и номера системных вызовов

Ответ 5

Существуют системные вызовы с переменными числами аргументов - свидетельствуем о вызове open() на уровне C, где третий параметр является необязательным (может не быть дополнительным на уровне ассемблера).

Лучше всего найти системные вызовы, идентифицированные по имени в syscalls.h в (предварительно обработанном) источнике других системных заголовков. Из них вы можете подсчитать количество аргументов. Просто получить правильные заголовки на месте может быть сложным, и, возможно, могут быть системные вызовы, которые никогда не отображаются как функции C напрямую (я не смотрел, но это маловероятно).

Вы можете посмотреть, как другой отладчик, такой как GDB, выполняет ту же работу.