2017-06-04 9 views
0

Ich kompiliere C-Code mit GCC und Montage einige x86-Code mit NASM unter Windows.Wie überschreibt `` Präfix `Option in NASM pro Symbol?

Nun, GCC standardmäßig (und ich konnte keine Option finden, dies zu ändern) vor Unterstrich _ an alle externen Symbolnamen (und erwarteten Namen).

Ich brauche diesen Assembler-Code, um mit GCC sowohl unter Windows als auch unter Linux zu arbeiten und Hacks so weit wie möglich zu vermeiden (und Code-Duplizierung; ich hatte separate .s Dateien für Windows/Linux).

Ich habe über die --prefix Flag in NASM (und verwendet). Jetzt für einige Symbole würde ich gerne NASM behandeln sie als ohne der führende Unterstrich (genaue Situation im Moment ist, dass ich den Einstiegspunkt in einem Linker-Skript ohne den führenden Unterstrich verweisen muss). Daher die Frage hier, wie man pro Symbol die --prefix/--postfix Flags von NASM überschreibt.

Fühlen Sie sich frei, dies als ein XY-Problem zu behandeln. Wenn es eine Möglichkeit gibt, das Mangelsystem von GCC für C zu setzen, wäre das zum Beispiel großartig.

+0

Betreffend "Fühlen Sie sich frei, dies als ein XY-Problem zu behandeln.". Ich bin neugierig auf einige Details, ob Sie dies tun, um ein Betriebssystem zu erstellen? –

+0

@MichaelPetch - In der Tat: D Ich arbeite mit anderen durch das [Little OS Book] (http://littleosbook.github.io/) und wir würden es vorziehen, den gleichen Code unter Windows und Linux zu kompilieren so lange wir können. – Noein

Antwort

1

Ich stolperte über das gleiche Problem. Ich habe eine Include-Datei mit vielen Definitionen wie

und einige andere Sachen erstellt.

Diese Datei (libc_win32.in) von einem "Master" enthalten ist Include-Datei (libc.inc):

%ifndef LIBC_INC 
%define LIBC_INC 

%ifdef win32 
    %include 'libc_win32.inc' 
%elifdef win64 
    %include 'libc_win64.inc' 
%elifdef elf32 
    %include 'libc_elf32.inc' 
%elifdef elf64 
    %include 'libc_elf64.inc' 
%else 
; %error "libc.inc" 
%endif 

%endif 

stelle ich die Symbole und schließen Sie die Dateien in der Befehlszeile:

nasm -fwin32 -dwin32 -plibc.inc ... 

oder

nasm -felf32 -delf32 -plibc.inc ... 

es ist ein vordefiniertes Makro namens __OUTPUT_FORMAT__, aber es funktioniert nur innerhalb o f ein Makro, nicht beim Programmstart.