Dodawanie wiodących podkreśleń do symboli złożenia za pomocą GCC na Win32?

Mam fragment kodu C, który wywołuje funkcję zdefiniowaną w złożeniu. Na przykład załóżmy, że foo.c zawiera:

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

I bar.s zawiera implementację bar () w zespole x86:

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

W Linuksie mogę łatwo skompilować i połączyć te źródła z GCC w następujący sposób:

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

W systemie Windows z MinGW kończy się to niepowodzeniem z błędem „niezdefiniowane odniesienie do„ bar ””. Okazuje się, że przyczyną tego jest to, że w systemie Windows wszystkie identyfikatory funkcji z konwencją wywołującą C są poprzedzone podkreśleniem, ale ponieważ „bar” jest zdefiniowany w złożeniu, nie otrzymuje tego prefiksu, a linkowanie nie powiedzie się. (Więc komunikat o błędzie rzeczywiście narzeka na brak symbolu _bar, a nie na pasek).

Podsumowując:

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

Pytanie brzmi teraz: jak mogę to dobrze rozwiązać? Gdybym pisał tylko dla Windows, mógłbym po prostu dodać podkreślnik do identyfikatora w bar.s, ale potem kod zepsułby się na Linuksie. Spojrzałem na gcc-fleading-underscore i-fno-leading-underscore opcje, ale żadna z nich nie działa (przynajmniej w systemie Windows).

Jedyną alternatywą, jaką teraz widzę, jest przekazanie pliku zespołu przez preprocesor C i ponowne zdefiniowanie wszystkich zadeklarowanych symboli ręcznie, jeśli zdefiniowano WIN32, ale to też nie jest zbyt ładne.

Czy ktoś ma do tego czyste rozwiązanie? Być może nadzorowałem opcję kompilatora? Może asembler GNU wspiera sposób na to, że ten konkretny symbol odnosi się do funkcji używającej konwencji wywołującej C i powinien być tak zniekształcony? Jakieś inne pomysły?

questionAnswers(4)

yourAnswerToTheQuestion