Forum: Compiler & IDEs gcc: Suche Dokumentation: WEAK - Reihenfolge beim Linken


von Bernd K. (prof7bit)


Lesenswert?

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
von Oliver S. (oliverso)


Lesenswert?

Die Reihenfolge der zu linkenden Dateien beim linker-Aufruf ist von 
Bedeutung.

Oliver

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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 :-)

von Daniel A. (daniel-a)


Lesenswert?

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
Noch kein Account? Hier anmelden.