Как я мог дизассемблировать системный вызов, чтобы я мог получить инструкции по сборке, связанные с ним
как разобрать системный вызов?
Ответы (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>
Таким образом, он обращается к «глобальной таблице смещений», которая, как я полагаю, содержит все векторы системных вызовов. Как сказано в другом посте, см. исходный код ядра (или исходный код стандартной библиотеки?) для получения подробной информации об этом.
dl_runtime_resolve()
. GOT (таблица глобальных смещений) содержит адрес уже разрешенных функций или инструкцию в PLT, следующую за непрямым переходом, поэтому он может перенаправить на резервный переход.
- person ninjalj; 17.03.2011
Я не думаю, что ты хочешь этого делать. Обработка системных вызовов сложна (см. http://www.ibm.com/developerworks/linux/library/l-system-calls/). Поскольку вы пометили этот вопрос как «linux», вы можете просто загрузить исходный код с kernel.org (что гораздо более понятным и информативным, чем ассемблерный код).
Чтобы понять системный вызов 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.