Генерация и отлов недействительной инструкции - PullRequest
0 голосов
/ 08 июля 2019

Я хочу изолировать пользовательский код операции в моей программе, чтобы перехватить недопустимое исключение кода операции, если оно есть.Если я пишу пустой основной файл, я вижу последовательность сборки, как показано ниже:

(gdb) list
1   void main()
2   {
3   }
(gdb) disass /r main
Dump of assembler code for function main:
   0x00000000004004ed <+0>: 55  push   %rbp
   0x00000000004004ee <+1>: 48 89 e5    mov    %rsp,%rbp
   0x00000000004004f1 <+4>: 5d  pop    %rbp
   0x00000000004004f2 <+5>: c3  retq   
End of assembler dump.

Если я записываю один случайный байт, например __asm__(".byte 0x01");, я вижу, что он автоматически добавляет к этому 5d и c3, поскольку он предполагаеткод операции ADD, поэтому ему нужно более одного байта.

0x00000000004004f1 <+4>:    01 5d c3    add    %ebx,-0x3d(%rbp)

Конец дампа ассемблера.

Если я добавлю NOP (0x90) до и после этого, он не будеттакже поможет, и он автоматически добавит 0x90 к 0x01.

0x00000000004004f1 <+4>:    90  nop
0x00000000004004f2 <+5>:    90  nop
0x00000000004004f3 <+6>:    90  nop
0x00000000004004f4 <+7>:    01 90 90 90 90 90   add    %edx,-0x6f6f6f70(%rax)
0x00000000004004fa <+13>:   90  nop
0x00000000004004fb <+14>:   5d  pop    %rbp
0x00000000004004fc <+15>:   c3  retq   

При выполнении этого ADD я получаю ошибку ошибки сегментации.Поэтому я не могу различить ошибку сегмента и неверную инструкцию / код операции.Я хочу изолировать этот код операции.Как насчет выравнивания на разных страницах и обработки ошибок страниц?

Любой комментарий?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...