¿Agregando guiones bajos a los símbolos de ensamblaje con GCC en Win32?

Tengo un fragmento de código C que llama a una función definida en ensamblaje. A modo de ejemplo, digamos que foo.c contiene:

<code>int bar(int x);  /* returns 2x */
int main(int argc, char *argv[]) { return bar(7); }
</code>

Y bar.s contiene la implementación de bar () en el ensamblaje x86:

<code>.global bar
bar:    movl 4(%esp), %eax
        addl %eax, %eax
        ret
</code>

En Linux puedo compilar y vincular fácilmente estas fuentes con GCC de la siguiente manera:

<code>% gcc -o test foo.c bar.s
% ./test; echo $?
14
</code>

En Windows con MinGW, esto falla con un error de "referencia no definida a` barra '". Resulta que la causa de esto es que en Windows todos los identificadores de funciones con convención de llamada C tienen un guión bajo, pero dado que la "barra" está definida en ensamblador, no obtiene este prefijo y la vinculación falla. (Por lo tanto, el mensaje de error en realidad se queja de que falta el símbolo _bar, no la barra).

Para resumir:

<code>% gcc -c foo.c bar.s
% nm foo.o bar.o
foo.o:
00000000 b .bss
00000000 d .data
00000000 t .text
         U ___main
         U _bar
00000000 T _main

bar.o:
00000000 b .bss
00000000 d .data
00000000 t .text
00000000 T bar
</code>

La pregunta ahora es: ¿cómo puedo resolver esto bien? Si escribiera solo para Windows, solo podría agregar el guión bajo al identificador en bar.s, pero luego el código se rompe en Linux. He mirado en gcc-fleading-underscore y-fno-leading-underscore opciones pero ninguno parece hacer nada (al menos en Windows).

La única alternativa que veo ahora es pasar el archivo de ensamblaje a través del preprocesador de C y redefinir todos los símbolos declarados manualmente si se define WIN32, pero eso tampoco es muy bonito.

¿Alguien tiene una solución limpia para esto? Tal vez una opción de compilador que supervisé? ¿Quizás el ensamblador GNU admite una forma específica de que este símbolo en particular se refiera a una función que usa la convención de llamada C y debería ser manipulado como tal? ¿Alguna otra idea?

Respuestas a la pregunta(4)

Su respuesta a la pregunta