Вопрос

Можно ли с помощью инструментов GNU (gcc, binutils и т. д.) преобразовать все вхождения ассемблерной инструкции в недействующую?В частности, gcc с опцией -pg генерирует следующую сборку (ARM):

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: ebfffffe    bl  0 <mcount>

Я хочу записать адрес этой последней инструкции, а затем изменить его на no, как в следующем коде.

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: e1a00000    nop         (mov r0,r0)

Ядро Linux может делать что-то подобное во время выполнения, но я ищу решение во время сборки.

Это было полезно?

Решение

Это, безусловно, будет проще с RISC-форматом инструкций фиксированной длины, чем, например, с.х86.

Использовать libelf должно быть относительно просто (хорошее руководство здесь: http://people.freebsd.org/~jkoshy/download/libelf/article.html) или libbfd (http://sourceware.org/binutils/docs-2.19/bfd/index.html), чтобы открыть объектный файл, изменить инструкции в разделе .text и записать его снова, используя предоставленные API.Стоит ли оно того или нет, будет зависеть от нетехнических соображений (хотя мне немного любопытно...).

Стоит отметить, что при использовании libelf или libbfd могут возникнуть некоторые проблемы, если это необходимо для работы в среде перекрестной разработки.

Другие советы

Вы можете скомпилировать код с помощью gcc -S для вывода листинга ассемблера вместо полной компиляции в объектный файл или исполняемый файл.Затем просто замените нужные инструкции на no-ops (например,с использованием sed) и продолжить компиляцию оттуда.

Если вы также хотите сделать это для объектных файлов или библиотек, для которых у вас нет исходного исходного кода, вместо этого вам придется использовать такой инструмент, как objdump(1) чтобы разобрать их и получить адреса инструкций, которые вы хотите заменить.Затем проанализируйте заголовки объектных файлов, чтобы найти смещения этих инструкций в файле, а затем замените машинные инструкции пустыми операциями непосредственно в объектных файлах.Это немного сложнее, но выполнимо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top