2012-10-07 22 views
7

Mi toolchain es una versión reciente de arm-gcc.macro de línea de comando del ensamblador de brazo gnu falla con "Identificador no válido para .ifdef"

Tengo un fragmento de código en un archivo de ensamblaje que debe incluirse/ensamblarse condicionalmente.

.ifdef MACRO_FROM_CMDLINE 
Assembly instr1 
Assembly instr2 
.endif 

El código encapsulado es una adición reciente.

He intentado tanto:

gcc -x assembler-with-cpp --defsym MACRO_FROM_CMDLINE=1 <along with other necessary options> 

gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 <along with other necessary options> 

Los resultados -D en "identificador no válido para .ifdef" y ".Si .endif sin errores".

Los resultados --defsym en "MACRO_FROM_CMDLINE = 1: No existe el archivo o directorio", "opción no reconocida --defsym" errores.

Respuesta

11

El binario gcc impulsa el proceso de compilación invocando una serie de otros programas en secuencia para realizar realmente las diversas etapas del trabajo (compilación, ensamblaje, vinculación).

Cuando dicen:

gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 ... 

le está pidiendo que se ejecute la fuente a través del preprocesador C y, a continuación, ejecute el resultado a través del ensamblador.

El paso preprocesador C se enciende:

.ifdef MACRO_FROM_CMDLINE 

en:

.ifdef 1 

antes de pasarlo al ensamblador, que entonces no puede tener sentido de él. Es por eso que obtiene el error de "identificador inválido". También explica por qué el preprocesador C #ifdef soluciona el problema.


--defsym no funciona porque es una opción para el ensamblador, no el programa gcc conductor. (El conductor gcc hace entender y pasar a través de algunos opciones a algunos de los programas que invoca, pero no todos.)

Usted puede, sin embargo, pasar opciones arbitrarias hasta el ensamblador usando el

-Wa,option[,option...] 

sintaxis, que cuenta la gcc conductor para pasar los opción (s) a través de al ensamblador (como una lista de opciones separados por un espacio).

Por ejemplo:

gcc -x assembler-with-cpp -Wa,--defsym,MACRO_FROM_CMDLINE=1 ... 

añade

--defsym MACRO_FROM_CMDLINE=1 

a la lista de opciones que se pasan a as cuando gcc lo invoca, y eso es cómo hacer su trabajo .ifdef original ejemplo.


Se puede ver los programas individuales invocados por gcc, y las opciones que en realidad pasa a ellos, añadiendo la opción -v.

En este caso, debería ver algo que se llama cc1 (el actual GCC compilador de C binario) invoca con el indicador -E (sólo preproceso) para preprocesar la entrada en un archivo temporal, y luego as invocado en el archivo temporal para montar eso.

+0

Confirmo que las opciones -Wa, descritas por Mat arriba funcionan bastante bien. – Raj

1

Extraño, pero resulta que necesitaba usar la sintaxis C en el archivo de ensamblaje.

#ifdef MACRO 
    Assembly Instruction 
    Assembly Instruction 
#endif 

y la macro tuvieron que ser superado mediante la opción -D.

+0

GAS admite ambos afaik, ¿Por qué no llama directamente a GAS en lugar de pasar por gcc en sus archivos de ensamblaje? – sgupta

+0

El uso de gcc (y no de GNU como directo) tiene la ventaja de invocar el enlazador después de la compilación, mientras que si se usa de manera directa, debe tomar el paso adicional de vincular después, usando ld. Entonces ... ¿solo un ahorro de tiempo de 10 segundos? – adam

+0

@sgupta: El uso de CPP es la mejor opción aquí, y 'as' directamente * no * preprocesa. (¡Pero '#' es el caracter de comentario de x86, por lo que el archivo aún puede ensamblarse!) Usar 'as' directamente es un mal consejo. Denomine su archivo 'foo.S' y compárelo con' gcc' + las opciones de gcc, p. Ej. '-m32',' -c'. –

Cuestiones relacionadas