Pregunta

¿Es posible el uso de herramientas GNU (gcc, binutils, etc) para modificar todas las apariciones de una instrucción de montaje en un no-op? Específicamente, gcc con la opción -pg genera el siguiente conjunto (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>

Quiero grabar la dirección de esta última instrucción y, a continuación, cambiar a un nop como en el siguiente código

   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)

El núcleo de Linux puede hacer algo similar a esto en tiempo de ejecución, pero estoy buscando una solución en tiempo de compilación.

¿Fue útil?

Solución

Esto sin duda será más fácil con un formato de instrucciones de longitud fija RISC-ish que por ejemplo, x86.

Debería ser relativamente fácil de usar libelf (buen tutorial aquí: http : //people.freebsd.org/~jkoshy/download/libelf/article.html ) o libbfd ( http://sourceware.org/binutils/docs-2.19/bfd/index.html ) para abrir el archivo de objeto, modificar las instrucciones dentro de la sección .text, y escribirlo de nuevo utilizando las API proporcionadas. Si vale la pena el esfuerzo o no dependerá de consideraciones no técnicas (soy un poco de curiosidad, aunque ...).

Vale la pena mencionar que podría haber algunas arrugas con el uso de libelf o libbfd si esto tiene que trabajar en un entorno de desarrollo transversal.

Otros consejos

Se puede compilar el código con gcc -S para emitir una lista ensamblador, en lugar de compilar plenamente en un archivo objeto o ejecutable. A continuación, basta con sustituir las instrucciones deseadas sin-ops (por ejemplo utilizando sed), y continuar la compilación de allí.

Si usted también quiere hacer esto para los archivos de objetos o bibliotecas que no tienen el código fuente original para, en su lugar se le tienen que utilizar una herramienta como objdump(1) para desmontarlas y obtener las direcciones de las instrucciones que desea reemplazar. A continuación, analizar las cabeceras de los archivos objeto de encontrar los desplazamientos dentro del archivo de esas instrucciones, y luego vuelva a colocar las instrucciones de la máquina sin-ops directamente en los archivos de objetos. Esto es un poco más difícil, pero factible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top