Bei Barematal-Targets bin ich gewohnt/erwarte ich, dass beim Linken nur die benötigten Symbole der Lib im Binary landen. Da überprüfen wir zum Teil, ob unerwartete Symbole im Binary sind, um versteckte Funktionalität "auszuschließen". (Insbesondere hätten wir Erklärungsbedarf wenn Symbole, die *malloc oder free heißen im Binary landen). Wenn man so linkt, dass das gesamte Binary im RAM vom MCU liegt, würde es mit der gesamten libm und libc etwas eng....
Bei GNU ld ist es wohl so, dass er per default unbekannte Symbole nur in später genannten libs sucht, außer man spielt (wie von
@Yamagi erwähnt) mit groups und whole-archive.
Dynamisch linken ist auch so eine Sache:
Die Frage ist da, was man erwartet:
Gibt man z.B. -lfoo -lbar an:
- Will man, dass libfoo und libbar in der DT_NEEDED-Section landen? Oder nur die benötigten shared libs?
- Wenn der Linker sieht, dass nur libfoo benötigt wird? Erwartest du libbar in DT_NEEDED? Oder nicht?
- Wenn nun aber am Zielsystem fun1 nicht in libfoo sondern libbar liegt? (Ich weiß, dann ist vermutlich das Buildsystem kaputt/seltsam[1]). Sollte dann der Linker nicht einfach alle angegeben Libs nach DT_NEEDED schreiben?
Aber das sind Fragen der Erwartungshaltung.
Das dynamische Linken löst dann der ld.so auf, je nach Konfiguration löst er alle Symbole beim Startup auf (LD_BIND_NOW), oder erst wenn es benötigt wird. Mit dem LD_AUDIT-Interface kann man auch schön sehen, was der ld.so macht und viele "lutige" Sachen machen [alternative Libs unterschieben,.....].
Wenn man dann den Spaß noch steigern will, beschäftigt man sich mit weak und strong symbols und der Reihenfolge der Funktionen im cinit-Sections (der ld.so führt diese in der "falschen" Reihenfolge aus - der Bug wird erst gefixt, wenn man einen relevanten Use Case vorzeigen kann).....
PS: Sorry, wenn ich abschweife....