Wie kompiliere ich Assembly-Routinen zur Verwendung mit einem C-Programm (GNU Assembler)?

8

Ich habe eine Menge von Assembly-Funktionen, die ich in C-Programmen verwenden möchte, indem ich eine Header-Datei erstelle. Zum Beispiel, wenn ich asm_functions.s habe, was die eigentlichen Assembly-Routinen und asm_functions.h definiert, die Prototypen für die Funktionen haben, sowie einige Standard # define's, die ich brauche. Mein Ziel ist es, ein C-Programm zu verwenden, sagen Sie test_asm.c, um die Assembly-Funktionen aufzurufen.

asm__functions.h:

%Vor%

asm__functions.s:

%Vor%

test__asm.c:

%Vor%

In so einer Situation wäre der richtige Weg, um das Programm zu verlinken? Ich habe so etwas versucht:

%Vor%

Aber ich bekomme immer noch einen Linker-Fehler von GCC, der sagt, dass meine Assembly-Routine undefiniert ist. Ich hoffe, dieses erfundene Beispiel ist gut genug, um die Situation zu erklären.

Danke!

BEARBEITEN:

Hier ist ein Ausschnitt der Ausgabe, wenn ich mit einem einzigen Befehl kompiliere:

%Vor%

Alle, wie PCI_FUNCTION_ID, sind in meiner Header-Datei definiert, die im C-Programm enthalten ist. Wenn ich den Assembler-Code selbst kompiliere, gibt es keine Fehler.

    
Mr. Shickadance 30.04.2009, 20:39
quelle

2 Antworten

14

Basierend auf den Dateien in Ihrer Frage, habe ich es geschafft, es zu kompilieren. Ich habe sowohl die Dateinamen als auch den Dateiinhalt geändert.

asm_const.h:

%Vor%

asm_functions.h:

%Vor%

asm_functions.S (das nachfolgende S muss groß sein! #include benötigt es):

%Vor%

test_asm.c:

%Vor%

Bitte beachten Sie, dass Sie die Assembly-Dateierweiterung .S mit Großbuchstaben S benötigen. Mit .s würde die .s-Datei nicht durch den Präprozessor laufen, also würde #include nicht funktionieren, und Sie wären es nicht kann ASM_CONST_1 in der .s-Datei verwenden.

Kompilieren Sie mit einem einzigen Befehl:

%Vor%

Alternativ können Sie mit mehreren Befehlen kompilieren und .o-Dateien erstellen:

%Vor%

Der Single-Befehl gcc kümmert sich um das Kompilieren der .S-Datei mit Gas, die .c-Datei mit dem C-Compiler von GCC und das Verknüpfen der resultierenden temporären .o-Dateien mit ld. gcc führt alle diese Befehle standardmäßig mit den entsprechenden Flags aus.

Auf einigen Systemen (aber nicht auf Linux mit der Standard-GCC-Installation) müssen Sie den Namen der exportierten Funktionen in der .S-Datei (aber nicht in den .c- oder .h-Dateien) mit einem Unterstrich versehen. So werden alle Instanzen von asm_foo nur in der .S-Datei _asm_foo .

    
pts 30.04.2009, 20:44
quelle
0

Haben Sie die Inline-Montage in Erwägung gezogen? Es wäre viel einfacher als die Verwendung einer Assembler-Datei.

Bearbeiten: Der Grund, warum Sie Linkfehler erhalten, liegt wahrscheinlich auch daran, dass der C-Compiler einen führenden Unterstrich für die Bezeichner der tatsächlichen Symbole hinzufügt. Fügen Sie in Ihrer Assemblydatei einen Unterstrich hinzu.

    
Zifre 30.04.2009 20:43
quelle

Tags und Links