2011-12-15 10 views
21

Si usted tiene un programa en C simple, comoEjecución de pasos de GCC manualmente, la compilación, el montaje, la vinculación de

int main(void) {return 0;} 

Puede ser compilado con gcc -o test test.c.

Según tengo entendido, gcc realiza la compilación, el montaje y el enlace. Los dos últimos pasos se logran ejecutando as y ld.

Puedo generar el código de ensamblaje usando gcc -S test.c.

¿Qué escribirías en un terminal, para convertir el código ensamblador en un ejecutable?

(la razón para hacerlo es aprender el montaje)

+2

En realidad, primero realiza el preprocesamiento, luego compila, luego ensambla y luego vincula. El preproceso puede ser una parte no trivial del proceso, especialmente si usa Boost ... –

+2

Puede usar el parámetro '-v' para ver cómo GCC llama a sus subprogramas, p. 'gcc -o test test.c -v' – mizo

Respuesta

39

Estas son las diferentes etapas utilizando gcc

gcc -E --> Preprocessor, but don't compile 
gcc -S --> Compile but don't assemble 
gcc -c --> assemble but don't link 
gcc with no switch will link your object files and generate the executable 
+2

Las versiones actuales de GCC ya no tienen un preprocesador por separado (puede solicitar solo preprocesamiento como el anterior) – vonbrand

+0

Buena respuesta, lástima que no explique demasiado – CristiFati

1

Después de hacer gcc -S -o test.s test.c, tipo gcc -o test test.s.

3

gcc test.s -o test compilará el test de test.s para usted.

NASM también podría valer la pena su tiempo - podría ser más fácil/más amigable que gcc para compilar ensamblaje.

+0

No realmente. 'gcc' maneja una gran cantidad de burocracia dependiente del sistema, en total compatibilidad con la forma en que maneja otras piezas de su proyecto. – vonbrand

0

Puede tener gcc iniciar y detener el proceso de compilación donde lo desee. gcc test.s -o test tendrá que compilar test.s desde el ensamblado en un archivo ejecutable.

0

Como usted puede o no puede saber, las cuatro etapas de compilación son preprocesasen (-E), compilar para el montaje (-S), montar a objetos código (-c), y finalmente enlace. Lo más difícil de descifrar fue cómo utilizar la salida del preprocesador. He aquí cómo hacerlo:

gcc -E hello.c | gcc -S -xc -o hello.s - 
gcc -c hello.s -o hello.o 
gcc hello.o -o hello 
Cuestiones relacionadas