Ich finde keine ausreichende Dokumentation über das Verhalten von weak-Symbolen beim Linken zweier .o Dateien, insbesondere interessiert mich ob die Reihenfolge der .o auf der Kommandozeile von Bedeutung ist, macht die Dokumentation darüber an irgendeiner Stelle die ich noch nicht gefunden habe eine definitive Aussage? Konkreter Fall: Ich linke startup.o mit .weak Symbolen und prog.o mit starken Symbolen in einem Aufruf von gcc zu einem .elf und bislang war die Reihenfolge egal doch mit aktuellem arm-none-eabi-gcc muss ich den Startup-Code zuerst angeben, ansonsten überschreiben die weak Symbole im startup.o die starken Symbole im prog.o. Dieses Verhalten kann momentan nur beobachtet werden wenn -flto verwendet wird, ohne LTO ist anscheinend keine Reihenfolge erforderlich. Außerdem scheint der Fall nur aufzutreten wenn startup.o aus einer assemblerdatei erzeugt wurde, Weak-Symbole aus C-Dateien scheinen noch das alte Verhalten zu zeigen. Macht die Doku zu diesem Thema irgendwelche Aussagen oder Garantien? Ich vermute nämlich einen Bug. Aber ohne Doku kann ichs nicht beweisen und ich finde nichts, bitte helft mir mal die entsprechende Stelle in der Doku zu finden. Beachte: Ich linke zwei nackte .o Dateien, keine Libs oder dergleichen. Wenn ich Zeit habe versuch ich mal ein minimales Beispiel zusammenzustellen das das Verhalten demonstriert, kann aber noch bis zum Wochenende dauern.
:
Bearbeitet durch User
Die Reihenfolge der zu linkenden Dateien beim linker-Aufruf ist von Bedeutung. Oliver
:
Bearbeitet durch User
Nachtrag: Nachzulesen unter der linker-Option -l „It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, ‘foo.o -lz bar.o’ searches library ‘z’ after file foo.o but before bar.o. If bar.o refers to functions in ‘z’, those functions may not be loaded.“ Oliver
Oliver S. schrieb: > Die Reihenfolge der zu linkenden Dateien beim linker-Aufruf ist von > Bedeutung. Auch und gerade für weak? Ich bekomme da gleiche Ergebnisse undabhängig von der Linkreihenfolge, wie auch zu erwarten. Allerdings hab ich nur 2 C-Module getestet, und mit LTO gibt's dann keine Linkreihenfolge mehr :-)
Soweit ich weiss ist es so, dass weak symbols theoretisch immer von strong symbols überschrieben werden, und immer nur höchstens ein Symbol übrig bleibt. Wenn man jedoch eine statische Library (.a) beim Linken angibt, wird nur das Symbol der ersten .o datei genommen, welche das Symbol enthält, selbst wenn es ein weak symbol ist. Man kann dieses Verhalten ändern, indem man -Wl,--whole-archive und -Wl,--no-whole-archive angibt. Wie -flto das ganze beeinflusst weiss ich nicht, ich finde, wenn es das Verhalten ändert sollte man das als Bug betrachten, ich verwende es wenn möglich nicht.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.