parametros librerias con compilar compilador comando archivo c++ c debugging gcc assembly

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)



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.


Usa el interruptor -S

g++ -S main.cpp

o también con gcc

gcc -S main.c

También ver this


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:

  1. 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

  2. Compilar y ejecutarlo.

  3. 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.