как разобрать системный вызов?

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


person user567879    schedule 09.02.2011    source источник


Ответы (3)


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

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

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

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

gcc  -o systest -g3 -O0 systest.c

Сбросить это:

objdump -d systest

Глядя в "основной" я вижу:

  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>

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

person Brad    schedule 09.02.2011
comment
PLT и GOT являются структурами динамического компоновщика. PLT или таблица связывания процедур содержит непрямые переходы (через GOT) к динамическим функциям и резервные переходы к dl_runtime_resolve(). GOT (таблица глобальных смещений) содержит адрес уже разрешенных функций или инструкцию в PLT, следующую за непрямым переходом, поэтому он может перенаправить на резервный переход. - person ninjalj; 17.03.2011

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

person EmeryBerger    schedule 09.02.2011
comment
Да, конечно, реализацию системного вызова можно понять по коду. - person shingaridavesh; 01.11.2012

Чтобы понять системный вызов Linux, просмотрите код.

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

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

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

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

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

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

person shingaridavesh    schedule 01.11.2012