как разобрать системный вызов? - PullRequest
4 голосов
/ 09 февраля 2011

Как я могу разобрать системный вызов, чтобы я мог получить инструкции по сборке, связанные с ним

Ответы [ 3 ]

4 голосов
/ 09 февраля 2011

Ну, вы могли бы сделать что-то вроде этого.Скажем, я хотел получить дамп сборки "dup":

Напишите это:

#include <stdio.h>
#include <sys/file.h>
int main() {
        return dup(0)
}

Скомпилируйте его:

gcc  -o systest -g3 -O0 systest.c

Сделайте дамп:

objdump -d systest

Глядя в "main", я вижу:

  400478:       55                      push   %rbp
  400479:       48 89 e5                mov    %rsp,%rbp
  40047c:       bf 00 00 00 00          mov    $0x0,%edi
  400481:       b8 00 00 00 00          mov    $0x0,%eax
  400486:       e8 1d ff ff ff          callq  4003a8 <dup@plt>
  40048b:       c9                      leaveq
  40048c:       c3                      retq
  40048d:       90                      nop
  40048e:       90                      nop
  40048f:       90                      nop

Итак, глядя на "dup @ plt", я вижу:

00000000004003a8 <dup@plt>:
  4003a8:       ff 25 7a 04 20 00       jmpq   *2098298(%rip)        # 600828 <_GLOBAL_OFFSET_TABLE_+0x20>
  4003ae:       68 01 00 00 00          pushq  $0x1
  4003b3:       e9 d0 ff ff ff          jmpq   400388 <_init+0x18>

Так что он делает вызов в "глобальная таблица смещений ", которая, как я предполагаю, имеет все векторы системных вызовов.Как и в другом сообщении, подробности см. В исходном коде ядра (или в источниках стандартной библиотеки?).

2 голосов
/ 09 февраля 2011

Я не думаю, что вы хотите это сделать. Обработка системных вызовов сложна (см. http://www.ibm.com/developerworks/linux/library/l-system-calls/). Поскольку вы пометили этот вопрос как "linux", вы можете просто загрузить исходный код с kernel.org (который будет гораздо более понятным и информативным код сборки).

0 голосов
/ 01 ноября 2012

Для понимания системного вызова linux просмотрите код.

Важные файлы:

/ include / linux / syscalls.h (все поддерживаемые системные вызовыв Linux)

/ arch / arm / kernel / entry-common.S (реализация системного вызова на уровне регистра)

/ arch / arm / kernel / Call.S (номера системных вызовов)

/ arch / arm / include / asm / unistd.h (адрес системного вызова)

Примечание: к таблице системных вызовов можно обращаться только изтолько system.map.

...