c++ - librerias - parametros del compilador gcc
¿Cómo se obtiene la salida del ensamblador de la fuente C/C++ en gcc? (14)
Bueno, como todos dijeron, usa la opción -S. Si usa la opción -save-temps, también puede obtener el archivo preprocesado ( .i), el archivo de ensamblaje ( .s) y el archivo de objeto (* .o). (Obtenga cada uno de ellos usando -E, -S y -c.)
¿Cómo se hace esto?
Si quiero analizar cómo se compila algo, ¿cómo obtengo el código de ensamblaje emitido?
Como se mencionó anteriormente, mira la bandera -S.
También vale la pena mirar la familia de banderas ''-fdump-tree'', en particular ''-fdump-tree-all'', que le permite ver algunas de las formas intermedias de gcc. A menudo, estos pueden ser más legibles que el ensamblador (al menos para mí), y le permiten ver cómo funcionan las pasadas de optimización.
Como todos lo han señalado, use la opción -S
para GCC. También me gustaría agregar que los resultados pueden variar (¡enormemente!) Dependiendo de si agrega o no opciones de optimización ( -O0
para ninguna, -O2
para una optimización agresiva).
En particular, en las arquitecturas RISC, el compilador a menudo transformará el código casi más allá del reconocimiento al hacer la optimización. ¡Es impresionante y fascinante mirar los resultados!
Desde: this
gcc -c -g -Wa, -a, -ad [otras opciones de GCC] foo.c> foo.lst
en alternativa a la respuesta de PhirePhly O simplemente use -S como todos dijeron.
Esto generará el código ASM con el código C + los números de línea entrelazados para ver más fácilmente qué líneas generan qué código.
# create assembler code:
c++ -S -fverbose-asm -g -O2 test.cc -o test.s
# create asm interlaced with source lines:
as -alhnd test.s > test.lst
Se encuentra en Algoritmos para programadores , página 3 (que es la quinceava página general del PDF).
La siguiente línea de comando es del blog de Christian Garbin.
g++ -g -O -Wa,-aslh horton_ex2_05.cpp >list.txt
Ejecuté G ++ desde una ventana de DOS en Win-XP, contra una rutina que contiene una conversión implícita
c:/gpp_code>g++ -g -O -Wa,-aslh horton_ex2_05.cpp >list.txt
horton_ex2_05.cpp: In function `int main()'':
horton_ex2_05.cpp:92: warning: assignment to `int'' from `double''
La salida es un código generado ensamblado que se revisa con el código original de C ++ (el código de C ++ se muestra como comentarios en el flujo de asm generado)
16:horton_ex2_05.cpp **** using std::setw;
17:horton_ex2_05.cpp ****
18:horton_ex2_05.cpp **** void disp_Time_Line (void);
19:horton_ex2_05.cpp ****
20:horton_ex2_05.cpp **** int main(void)
21:horton_ex2_05.cpp **** {
164 %ebp
165 subl $128,%esp
?GAS LISTING C:/DOCUME~1/CRAIGM~1/LOCALS~1/Temp/ccx52rCc.s
166 0128 55 call ___main
167 0129 89E5 .stabn 68,0,21,LM2-_main
168 012b 81EC8000 LM2:
168 0000
169 0131 E8000000 LBB2:
169 00
170 .stabn 68,0,25,LM3-_main
171 LM3:
172 movl $0,-16(%ebp)
No veo esta posibilidad entre las respuestas, probablemente porque la pregunta es de 2008, pero en 2018 puede usar el sitio web en línea de Matt Goldbolt https://godbolt.org
También puede git clonar localmente y ejecutar su proyecto https://github.com/mattgodbolt/compiler-explorer
Si buscas ensamblaje LLVM:
llvm-gcc -emit-llvm -S hello.c
Si lo que desea ver depende de la vinculación de la salida, entonces objdump en el archivo de objeto de salida / ejecutable también puede ser útil, además de la mencionada gcc -S. Aquí hay un guión muy útil de Loren Merritt que convierte la sintaxis de objdump predeterminada en la sintaxis nasm más legible:
#!/usr/bin/perl -w
$ptr=''(BYTE|WORD|DWORD|QWORD|XMMWORD) PTR '';
$reg=''(?:[er]?(?:[abcd]x|[sd]i|[sb]p)|[abcd][hl]|r1?[0-589][dwb]?|mm[0-7]|xmm1?[0-9])'';
open FH, ''-|'', ''/usr/bin/objdump'', ''-w'', ''-M'', ''intel'', @ARGV or die;
$prev = "";
while(<FH>){
if(/$ptr/o) {
s/$ptr(/[[^/[/]]+/],$reg)/$2/o or
s/($reg,)$ptr(/[[^/[/]]+/])/$1$3/o or
s/$ptr/lc $1/oe;
}
if($prev =~ //t(repz )?ret / and
$_ =~ //tnop |/txchg *ax,ax$/) {
# drop this line
} else {
print $prev;
$prev = $_;
}
}
print $prev;
close FH;
Sospecho que esto también se puede utilizar en la salida de gcc -S.
Utilice "-S" como una opción. Muestra la salida de montaje en el terminal.
Utilice la opción -S:
gcc -S program.c
Estos son los pasos para ver / imprimir el código de ensamblaje de cualquier programa C en su Windows
consola / terminal / indicador de comando:
Escriba un programa en C en un editor de código C como bloques de código y guárdelo con una extensión .c
Compilar y ejecutarlo.
Una vez ejecutado con éxito, vaya a la carpeta donde ha instalado su compilador gcc y entregue el
siguiente comando para obtener un archivo ''.s'' del archivo ''.c''
C: / gcc> gcc -S ruta completa del archivo C ENTER
Un comando de ejemplo (como en mi caso)
C: / gcc> gcc -SD: / Aa_C_Certified / alternate_letters.c
Esto genera un archivo ''.s'' del archivo ''.c'' original
4. Después de esto, escriba el siguiente comando
C; / gcc> cpp filename.s ENTRAR
Ejemplo de comando (como en mi caso)
C; / gcc> cpp alternate_letters.s
Esto imprimirá / emitirá todo el código de lenguaje ensamblador de su programa C.
Use la opción -S
para gcc (o g ++).
gcc -S helloworld.c
Esto ejecutará el preprocesador (cpp) sobre helloworld.c, realizará la compilación inicial y luego se detendrá antes de que se ejecute el ensamblador.
Por defecto esto generará un archivo helloworld.s
. El archivo de salida aún se puede configurar mediante la opción -o
.
gcc -S -o my_asm_output.s helloworld.c
Por supuesto, esto solo funciona si tienes la fuente original. Una alternativa si solo tiene el archivo de objeto resultante es usar objdump
, configurando la opción --disassemble
(o -d
para el formulario abreviado).
objdump -S --disassemble helloworld > helloworld.dump
Esta opción funciona mejor si la opción de depuración está habilitada para el archivo objeto ( -g
en el momento de la compilación) y el archivo no se ha eliminado.
Ejecutar el file helloworld
le dará alguna indicación sobre el nivel de detalle que obtendrá al usar objdump.