gdb disassemble/rspara mostrar también los bytes de origen y sin procesar
Con este formato, se acerca mucho a la objdump -Ssalida:
gdb -batch -ex "disassemble/rs $FUNCTION" "$EXECUTABLE"
C Principal
#include <assert.h>
int myfunc(int i) {
i = i + 2;
i = i * 2;
return i;
}
int main(void) {
assert(myfunc(1) == 6);
assert(myfunc(2) == 8);
return 0;
}
Compilar y desmontar
gcc -O0 -ggdb3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
gdb -batch -ex "disassemble/rs myfunc" main.out
Desmontaje:
Dump of assembler code for function myfunc:
main.c:
3 int myfunc(int i) {
0x0000000000001135 <+0>: 55 push %rbp
0x0000000000001136 <+1>: 48 89 e5 mov %rsp,%rbp
0x0000000000001139 <+4>: 89 7d fc mov %edi,-0x4(%rbp)
4 i = i + 2;
0x000000000000113c <+7>: 83 45 fc 02 addl $0x2,-0x4(%rbp)
5 i = i * 2;
0x0000000000001140 <+11>: d1 65 fc shll -0x4(%rbp)
6 return i;
0x0000000000001143 <+14>: 8b 45 fc mov -0x4(%rbp),%eax
7 }
0x0000000000001146 <+17>: 5d pop %rbp
0x0000000000001147 <+18>: c3 retq
End of assembler dump.
Probado en Ubuntu 16.04, GDB 7.11.1.
objdump + awk soluciones alternativas
Imprima el párrafo como se menciona en: /unix/82944/how-to-grep-for-text-in-a-file-and-display-the-paragraph-that-has-the -texto
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <FUNCTION>/'
p.ej:
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <myfunc>/'
da solo:
0000000000001135 <myfunc>:
1135: 55 push %rbp
1136: 48 89 e5 mov %rsp,%rbp
1139: 89 7d fc mov %edi,-0x4(%rbp)
113c: 83 45 fc 02 addl $0x2,-0x4(%rbp)
1140: d1 65 fc shll -0x4(%rbp)
1143: 8b 45 fc mov -0x4(%rbp),%eax
1146: 5d pop %rbp
1147: c3 retq
Cuando se usa -S, no creo que haya una forma a prueba de fallas, ya que los comentarios del código podrían contener cualquier secuencia posible ... Pero lo siguiente funciona casi todo el tiempo:
objdump -S main.out | awk '/^[[:xdigit:]]+ <FUNCTION>:$/{flag=1;next}/^[[:xdigit:]]+ <.*>:$/{flag=0}flag'
adaptado de: Cómo seleccionar líneas entre dos patrones de marcador que pueden ocurrir varias veces con awk / sed
Respuestas de la lista de correo
Hay un hilo de 2010 en la lista de correo que dice que no es posible: https://sourceware.org/ml/binutils/2010-04/msg00445.html
Además de la gdbsolución alternativa propuesta por Tom, también comentan sobre otra solución (peor) de compilación con la -ffunction-sectionque se coloca una función por sección y luego se descarga la sección.
Nicolas Clifton le dio un WONTFIX https://sourceware.org/ml/binutils/2015-07/msg00004.html , probablemente porque la solución alternativa de GDB cubre ese caso de uso.
static, el compilador podría incluirla en sus sitios de llamada. Esto puede significar que es posible que no haya ninguna función para desmontar, per se . Si puede detectar símbolos para otras funciones, pero no la función que está buscando, esto es un fuerte indicio de que la función se ha incluido. Valgrind aún puede hacer referencia a la función original preincluida porque la información de depuración del archivo ELF almacena el origen de cada instrucción individual, incluso si las instrucciones se mueven a otro lugar.