обработка исключений — Как восстановить длину и адрес блока C ++ try / throw / catch из машинного кода?

Я делаю проект, который переупорядочивает базовые блоки внутри функции во время выполнения в C ++ под 64-битным Linux. Конечно, процесс переупорядочения включает в себя обновление инструкций, таких как «jmp» и т. Д. Одна проблема заключается в том, что если (я полагаю) компилятор (clang ++ или g ++) определяет блок try {…}, используя диапазон, т. Е. От address1 до Адрес 2; переупорядоченный код будет иметь проблемы (некоторые базовые блоки перемещены за пределы диапазона, а некоторые новые базовые блоки заменены).

Мой вопрос: определяет ли компилятор / программа блок try {…}, используя диапазон? Если так или нет, как я могу узнать и изменить соответствующие детерминанты, с помощью которых я могу восстановить блоки try / throw / catch и позволить программе нормально выполняться после переупорядочения; когда программа уже была загружена в память?

0

Решение

FYI, Вот является соответствующим документом для реализации LLVM для try-catch. G ++ делает что-то очень похожее.

Когда вы говорите по диапазону, я предполагаю, что вы думаете, что компилятор предположит, что инструкция кода от 0x0010 до 0x0020 — это код, а инструкция от 0x0020 до 0x0024 — для блока catch. Из спецификации LLVM это не основывается на таком предположении.

Редактировать:

Вот еще немного прочтения для реализации того, как g ++ и clang реализуют try-catch

0

Другие решения


По вопросам рекламы [email protected]