Erste GCC zu kompilieren, ohne das einfügen Aufruf von memcpy
Ich bin derzeit mit GCC 4.5.3, zusammengestellt für PowerPC 440, und bin kompilieren von code, der nicht erforderlich ist, libc. Ich habe keine direkten Aufrufe von memcpy(), aber der compiler scheint das einsetzen eines während des Baus.
Gibt es linker-Optionen wie -nostdlib, -nostartfiles, -nodefaultlibs aber ich bin nicht in der Lage, Sie zu benutzen, wie ich es nicht mache die Verknüpfung phase. Ich bin nur kompilieren. Mit so etwas wie dies:
$ powerpc-440-eabi-gcc -O2 -g -c -o output.o input.c
Wenn ich überprüfen Sie die Ausgabe.o, nm, sehe ich einen Verweis auf memcpy:
$ powerpc-440-eabi-nm output.o | grep memcpy
U memcpy
$
Den GCC Mann Seite macht es klar, wie zu entfernen Aufrufe von memcpy und andere libc-Aufrufe mit dem linker, aber ich will nicht die compiler an, legen Sie Sie in den ersten Platz, da bin ich mit einem völlig anderen linker (nicht GNU ld, und es nicht wissen, über libc).
Vielen Dank für jede Hilfe können Sie zur Verfügung stellen.
- Wenn sonst nichts funktioniert, eine einfache byte-by-byte, CPU-basierte Implementierung von memcpy ausreichend, zumindest für selten benutzte Fällen ist wahrscheinlich kürzer als die meisten der Antworten hier gepostet.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie deaktivieren, dass die Optimierung mit -fno-builtin. Ich hatte dieses problem einmal, wenn Sie versuchen zu kompilieren memcpy für eine C-Bibliothek. Es nannte sich selbst. Oops!
mem*
Anrufe werden noch eingefügt, egal was. Sehen Droopycom Antwort, das ist die echte!Gcc strahlt Aufruf von memcpy in einigen Umständen, zum Beispiel, wenn Sie das kopieren einer Struktur.
Es gibt keine Möglichkeit das zu ändern GCC Verhalten, aber Sie können versuchen, dies zu vermeiden, ändern Sie Ihren code, um zu vermeiden, eine solche Kopie. Beste Wette ist, um den Blick auf die Versammlung, um herauszufinden, warum gcc ausgegeben die memcpy und versuchen, das zu umgehen. Das ist ärgerlich aber, da Sie im Grunde brauchen, um zu verstehen, wie gcc arbeitet.
Auszug aus http://gcc.gnu.org/onlinedocs/gcc/Standards.html:
Meisten compiler unterstützen Routinen von GCC vorhanden sind, die libgcc, aber es gibt ein paar Ausnahmen. GCC benötigt die freistehende Umgebung bieten memcpy, memmove, memset und memcmp. Schließlich, wenn __builtin_ - Falle verwendet wird, und das Ziel wird nicht implementieren die trap-Muster, dann wird GCC emittieren einen Aufruf von abort.
const int
array. Und ja, wir Schießen konnten uns von Gießen entfernt const, aber nehmen wir das Gewehr-Sicherheit sehr ernst nehmen und hier nicht so einen Unsinn unterhalten. Das Verbleibende Problem könnte sein, dass unser array ist nun in .Daten, die statt auf dem lokalen stack. Aber auch dies ist nicht ein Anliegen für unsere Nutzung. YMMV.Gibt es keine Notwendigkeit zu
-fno-builtins
oder-ffreestanding
da Sie unnötig deaktivieren Sie viele wichtige OptimierungenDies ist eigentlich "optimiert", die von der gcc-tree-loop-verteilen-Muster, so zu deaktivieren das unerwünschte Verhalten, während die nützliche builtin-Funktionen kannst du nur verwenden:
-fno-tree-loop-distribute-patterns
Musl-libc verwendet diese Flagge für seine bauen und hat die folgenden Hinweis in Ihrem configure-Skript (ich sah durch die Quelle und hat keine Makros, so dass diese sollte genug sein)
Können Sie auch fügen Sie diese als attribute zu den einzelnen Funktionen in den gcc mit seiner Optimierung-Attribut, so dass andere Funktionen profitieren können, ruft
mem*()
mem*()
verschwinden. Dein Vorschlag die Funktion Attribut funktioniert auch, also ich ' m nur knallen hier ein Beispielvoid __attribute__((optimize("-fno-tree-loop-distribute-patterns"))) init_bss(void) { \* low-level .bss init function *\}
. Auch muss ich hinzufügen, dass diese Optimierung wird nur eingeschaltetO3
soweit ich das sagen kann.Können Sie auch machen Sie Ihre binäre eine "freistehende" ein:
(Absatz Hinzugefügt von mir)
Mehr hier. Und die entsprechende gcc-option/s (keywords
-ffreestanding
oder-fno-builtin
) finden Sie hier.