2016-04-16 11 views
1

Angenommen, wirWie behandelt ld Code, der zweimal geliefert wird (in einer Quelldatei und in einer Bibliothek)?

gcc -Dmyflag -lmylib mycode.c 

nennen, wo mylib alle mycode enthält, aber ohne -Dmyflag zusammengestellt. Somit sind alle Funktionen und anderen Entitäten, die in implementiert sind, in zwei Versionen für den Lader verfügbar. Empirisch finde ich, dass die Version von mycode übernommen wird. Kann ich mich darauf verlassen? Wird immer mylib überschreiben?

Antwort

1

Empirisch finde ich, dass die Version von mycode übernommen wird.

lesen this explanation, wie Linker arbeitet mit Archivbibliotheken und möglicherweise this one.

Kann ich mich darauf verlassen?

Sie sollten sich darauf verlassen zu verstehen, wie dies funktioniert.

Wenn Sie Material verstanden in referenzierten Links, werden Sie feststellen, dass das Hinzufügen von main zu libmylib.a die Antwort invertieren (und wenn mycode.c auch main enthält, werden Sie doppelte Symboldefinition Fehler erhalten).

Wenn Sie eine dynamische Bibliothek libmylib.so verwenden, sind die Regeln anders, und die Bibliothek wird immer auf die Haupt binären verlieren, obwohl es viele Komplikationen, wie LD_PRELOAD, die Verknüpfung der Bibliothek mit -Bsymbolic und andere.

Kurz gesagt, sollten Sie lieber nicht tun dies überhaupt tun.