2016-05-01 5 views
1

Ich mache ein Projekt, das das Schreiben eines Makefiles enthält. Hier habe ich 2 verschiedene Makefiles. Die erste macht den ersten Build-Schritt. Im zweiten Makefile versuche ich, die ursprünglich generierten Objektdateien (Pfade zur Verfügung gestellt) zu verwenden und eine weitere Objektdatei hinzuzufügen, die sonst wo erzeugt wird. Das Problem, mit dem ich hier konfrontiert bin, ist, dass der Linker diese neue Objektdatei nicht mit den älteren verknüpfen kann.Makefile-Linker ist nicht in der Lage, eine der Objektdateien zu verknüpfen

Ich verwende diesen Befehl, um diesen Schritt auszuführen.

arm-none-eabi-g++ -T ../linker.ld -nostartfiles -Xlinker --gc-sections -Wl,-Map,"map_file.map" -specs=nano.specs -o "target.elf" new_file.o all_older_files.o 

Hier die new_file.o ist von arm_eabi Version 0 und all_older_files.o ist arm_eabi Version 5. Dies ist jedoch nicht mir keine Fehler oder eine Warnung gibt. Interessant ist, dass einige der Symbole in der Datei new_file.o in der Datei target.elf enthalten sind. Ich habe das Linker-Skript geprüft und überprüft, konnte aber keine Lösung finden und überprüfe auch, ob die eabi-Version einen Unterschied macht, aber es ist dasselbe, wenn ich die Elf-Datei manuell mit einem Elf-Editor bearbeite.

Alles, was ich will ist, dass ich die Abschnitte in der new_file.o in diesem target.elf enthalten muss, damit ich diese verwenden kann.

+0

Zuerst, warum brauchen Sie hier zwei Makefiles? Sie sind nicht, Gott bewahre, rekursiv aufrufen Make on ein Makefile von der anderen? –

+0

Ich bin verwirrt - Sie sagen, dass der Linker keine Fehler gibt, erfolgreich eine Ausgabe ELF generiert, und die verknüpfte ELF enthält Zeug aus den Eingabeobjekten - auf welche Weise ist das "nicht in der Lage zu verknüpfen", genau? Es klingt eher so, als würde Ihr Linker-Skript einfach mehr verwerfen, als Sie wollten, aber ohne zu wissen, was das Skript macht und welche Abschnitte die Objekte tatsächlich enthalten, wer kann das sagen? Oder vielleicht wurden die fehlenden Teile einfach nicht durch etwas anderes referenziert, so dass sie weggeworfen wurden, weil du es gesagt hast. Und was hat das mit Makefiles zu tun? – Notlikethat

+0

@MarkGaleck In meinem Projekt ist die erste Make-Datei wie ein Auto-Gen-Makefile aus der Eclipse, da ich das Eclipse-IDE-basierte C-Projekt verwende. Das zweite Makefile ist das, was in den Post_Build-Optionen festgelegt ist, und ich benutze es, um einige zusätzliche Dateien zu erzeugen, die ich in meinem Projekt benötigte. Ich wollte die Autogen-Datei nicht bearbeiten oder Änderungen an den Projekteinstellungen vornehmen. – codelock

Antwort

0

Ich denke, ich habe das. Danke @Notlikethat, deine Einsicht hat mir geholfen. Ich habe herausgefunden, dass die "--gc-Abschnitte" die Symbole und Abschnitte ignorieren, auf die nicht verwiesen wurde.

Wenn ich dies jedoch das erste Mal versuchte, waren die Abschnitte durch große Speicherportionen ausgeschaltet, als es sein sollte, und dachten, dies sei nicht die Lösung. Aber später habe ich bemerkt, dass das ursprüngliche Auto-Gen-Makefile auch die gleichen unbenutzten Abschnitte entfernt. Also musste ich das in der Eclipse-Projekteinstellung deaktivieren und dann dieses Flag in meinem Makefile entfernen. Dadurch wurden die Abschnitte dort platziert, wo sie sein sollten.

Vielen Dank, das hat mir eine Menge Zeit gespart, als ich damit ein wenig länger als nötig kämpfte.

Verwandte Themen