Я делаю проект, который переупорядочивает базовые блоки внутри функции во время выполнения в C ++ под 64-битным Linux. Конечно, процесс переупорядочения включает в себя обновление инструкций, таких как «jmp» и т. Д. Одна проблема заключается в том, что если (я полагаю) компилятор (clang ++ или g ++) определяет блок try {…}, используя диапазон, т. Е. От address1 до Адрес 2; переупорядоченный код будет иметь проблемы (некоторые базовые блоки перемещены за пределы диапазона, а некоторые новые базовые блоки заменены).
Мой вопрос: определяет ли компилятор / программа блок try {…}, используя диапазон? Если так или нет, как я могу узнать и изменить соответствующие детерминанты, с помощью которых я могу восстановить блоки try / throw / catch и позволить программе нормально выполняться после переупорядочения; когда программа уже была загружена в память?
FYI, Вот является соответствующим документом для реализации LLVM для try-catch. G ++ делает что-то очень похожее.
Когда вы говорите по диапазону, я предполагаю, что вы думаете, что компилятор предположит, что инструкция кода от 0x0010 до 0x0020 — это код, а инструкция от 0x0020 до 0x0024 — для блока catch. Из спецификации LLVM это не основывается на таком предположении.
Редактировать:
Вот еще немного прочтения для реализации того, как g ++ и clang реализуют try-catch