Donnerstag, Mai 28, 2020

Kompilieren von C-Datei mit Assembler-Datei-Abhängigkeiten

Ich habe eine Datei-app.c, die Aufrufe von zwei externen Funktionen, dh. func_asm1 und func_asm2. Beide Funktionen sind in einer eigenen Assembler-file, dh. func_asm1.S und func_asm2.S. Darüber hinaus
Ich habe zwei header-Dateien, dh. func_asm1.h und func_asm2.h, wo die Schnittstelle der beiden assembler-Funktionen sind definiert:

extern void func_asm1(unsigned int *r, const unsigned int *a);

Haupt-file der app.c enthält die beiden header func_asm1.h und func_asm2.h, mein make-Datei
sieht im moment wie folgt, aber ich nicht funktioniert… Jemand eine Idee, was falsch sein könnte?

CC  = bin/arm-elf-gcc
AS  = bin/arm-elf-as
SFLAGS=-S -O2

func_asm1.o: func_asm1.S
    $(AS) -o [email protected] $< 

func_asm2.o: func_asm2.S
    $(AS) -o [email protected] $<

app.o: app.c app.h func_asm1.h func_asm2.h
    $(CC) $(SFLAGS) app.c -o app.o func_asm1.o func_asm2.o

Vielen Dank für Eure Hilfe!

  • Welche Fehler sind Sie immer?
InformationsquelleAutor reinhard | 2011-01-28

2 Kommentare

  1. 2

    Ich denke, dein makefile hat falschen Abhängigkeiten:

    Der Letzte Teil sollte so etwas wie:

    func_asm1.o: func_asm1.S
    $(AS) -o [email protected] $< 
    
    func_asm2.o: func_asm2.S
    $(AS) -o [email protected] $<
    
    app: app.c app.h func_asm1.h func_asm2.h func_asm1.o func_asm2.o
    $(CC) $(SFLAGS) app.c -o app.o func_asm1.o func_asm2.o
    

    Warum ? Da func_asm1.o und func2.o hängt Ihre source-code (ich gehe davon aus, dass Sie nicht func_asm.h im assembler source-code)
    Auf der anderen Seite, app.o hängt von seiner source-code (app.c), die header-Dateien (app.h, func_asm1.h und func_asm2.h) und die Objekt-code für die assembly-Dateien. Beachten Sie, dass Sie kompilieren UND zu verknüpfen, dass ein Teil des makefile, so dass, wenn Sie den Objekt-code für die assembly-Dateien ändern, müssen Sie verknüpfen die Anwendung und führen Sie daher diese Zeilen.

    Als ich habe schon darauf hingewiesen, in den Kommentaren, sollten Sie überprüfen die Parameter übergeben, um gcc (das -S-flag übergeben SFLAGS )

    • Sollten Sie die „app.o“ „app“ (dh. Objekt ausführbare Datei), wenn Sie tun, Verlinkung zu. Beachten Sie auch, das original-poster hat -in seiner SFLAGS, also gcc ist nur die Generierung Liste der assembly als Ausgabe, nicht Objekt oder ausführbare Datei aus.
    • Du hast Recht. Ich habe behoben, der Abhängigkeit und stellte fest, über das -S-flag.
  2. 1

    Den -S option weist den gcc zu erzeugen assembler-output eher als ein Objekt, das ist nicht, was Sie wollen.

    Wenn Sie gcc verwenden, geben Sie einfach die assembler-Dateien in gcc:

    .S.o:
        $(CC) $(ASFLAGS) -o [email protected] -c $<
    
    .c.o:
        $(CC) $(CFLAGS) -o [email protected] -c $<
    
    app: app.o func_asm1.o func_asm2.o
        $(CC) $(LDFLAGS) -o [email protected] $^
    

    Für die Nachverfolgung von Abhängigkeiten, ich würde verlängern die beiden kompilieren Regeln mit -MD -MP und füge die generierte *.d Dateien in meinem Makefile, sondern als Liste-Kopfzeilen ausdrücklich.

Kostenlose Online-Tests