Попытка запретить инструкцию - PullRequest
1 голос
/ 25 апреля 2009

Возможно ли использовать инструменты GNU (gcc, binutils и т. Д.), Чтобы преобразовать все вхождения инструкции по сборке в no-op? В частности, 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>

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

   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 может делать нечто подобное во время выполнения, но я ищу решение во время сборки.

Ответы [ 2 ]

6 голосов
/ 25 апреля 2009

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

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

4 голосов
/ 25 апреля 2009

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

Было бы относительно просто использовать 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 могут возникнуть некоторые проблемы, если это необходимо для работы в кросс-среде разработки.

...