Ich möchte eine statische .a-Bibliothek für mein Projekt aus mehreren Quellen erstellen, von denen einige schwache Funktionen definieren und andere sie implementieren. Nehmen wir als Beispiel:
lib1.c:
%Vor%lib2.c:
%Vor%Dann möchte ich sie in eine einzige Bibliothek legen, damit sie für die Endanwendung transparent erscheint
%Vor% Aber es gibt jetzt 2 Symbole myHandler
in libhandlers:
Und dann, wenn die lib verwendet wird, ist die schwache Referenz verknüpft. Die einzige Lösung, die ich im Moment habe, ist, nicht in die Bibliothek lib2.c
aufzunehmen, sondern sie als Quelle im Makefile der Anwendung hinzuzufügen ... das ist nicht befriedigend, da ich nur ein paar Bibliotheken zur Verfügung stellen möchte und nicht eine ganze Menge Dateien.
Die Option --whole-archive
ist auch nicht befriedigend, da ich am eingebetteten System arbeite und nicht alle Dinge einschließen möchte, die ich nicht brauche.
Gibt es eine Möglichkeit, die Bibliothek so zu kompilieren, dass das schwache Symbol verschwindet, wenn ein starkes Symbol bereitgestellt wird?
HINWEIS: Ich verwende arm-none-eabi-gcc v4.8
Dies ist ein Nebenprodukt der Funktionsweise von .a
libraries - sie sind einfach eine Sammlung von .o
-Dateien.
Was beim Kompilieren der Linkzeit passiert, ist, dass der erste Verweis auf den Namen auf die schwache Referenz aufgelöst wird und der starke Name niemals eingesehen wird.
Sie können dies selbst testen, indem Sie sowohl den identischen Namen als auch den starken Namen eingeben und Sie werden genau dasselbe Verhalten sehen.
Wenn Sie möchten, dass die starken Referenzen zuerst aufgelöst werden, dann fügen Sie sie früher in das Archiv ein oder erstellen Sie ein separates starkes Archiv und verknüpfen Sie dieses zuerst in der Verbindungslinie.
Sie sind nicht direkt auf Ihren Fall anwendbar, da Sie eine eingebettete Umgebung verwenden, schwache oder starke Referenzen treten jedoch beim Erstellen / Verwenden von .so
dynamische Bibliotheken und nicht .a
-Archiven richtig in Kraft. Wenn Sie ein .so erstellen, erzeugen alle schwachen Referenzen, aus denen die Bibliothek besteht, keinen Fehler, und nur einer davon wird für das Endprodukt verwendet. und wenn es irgendwo eine starke Definition gibt, dann wird sie verwendet und nicht irgendeine der schwachen (das funktioniert nur dann richtig, wenn Sie beim Erstellen eines .so
alle .o
-Dateien verknüpfen, die es separat ausmachen, oder verwenden Sie --whole-archive
beim Erstellen von .so
, wenn Sie mit .a
verlinken).