Was bedeutet die Warnung genau, wenn das verdeckte Symbol von DSO referenziert wird?
Ich habe ein problem, die Verknüpfung einige gemeinsam genutzte Bibliothek mit g++. Es gibt mir eine Warnung wie:
hidden symbol XXX in YYY is referenced by DSO /usr/lib/...
Ich habe einige Fragen zu bestimmten Problemen, aber ich will es verstehen, in einem ganz - was hat diese Warnung zu bedeuten und was ist ein Ursache:
- Was ist die DSO?
- Was ist ein verstecktes symbol?
- Wie kann es dann verwiesen werden, wenn Sie verborgen ist?
InformationsquelleAutor der Frage abyss.7 | 2014-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist ein DSO?
Einen DSO ist ein Dynamic Shared Objectoder weniger formell eine shared library.
Was ist ein verstecktes symbol?
Einen versteckte symbol ist ein symbol (d.h. name der Funktion oder Daten-Objekt)
kompiliert wurde mit versteckte Verknüpfung, z.B. nach den (GCC spezifisch)
Erklärung:
Wenn
x
ist in einem DSO dann dynamische Bindung kann nicht auf es von eineverschiedene DSO. Der linker kann sehen
x
(es ist nichtstatic
), aber es ist nichtverfügbar für dynamische Gestänge. Dokumentation hier
Wie kann es dann verwiesen werden, wenn Sie verborgen ist?
Es kann nicht sein, das ist, was Sie werden gewarnt über. E. g. die linktime Warnung:
ist Ihnen zu sagen, ein DSO in der Verknüpfung verweist das symbol
stat
undder linker kann, suchen Sie eine definition von
stat
im/usr/lib/libc_nonshared.a
,aber (offensichtlich), dass die definition nicht in der DSO verweist
und nicht aus verwiesen werden, dass die DSO, weil es versteckt ist.
Bekommen Sie dieses problem, wenn das problem DSO wurde nicht korrekt gebaut für den Einsatz
als DSO. Sehen dieses Beispiel
und Folgen Sie den follow-ups für die Lösung.
Weiterhin für OP ' s followups
Linker sagt:
DSO
X
enthält eine Referenz auf symbolS
. Finde ich eine definition von symbolS
ist ein weiterer verknüpften ModulY
aber diese definition nicht genutzt werden, erfüllen die Referenz in
X
dynamisch (d.h. zur Laufzeit), weilS
hat versteckte Verknüpfung inY
.Möglicherweise haben Sie nicht explizit gekennzeichnet sind alle Symbole ausgeblendet, in die nicht freigegebene Objekt. Je nach dem wie es gebaut wurde, Symbole
möglicherweise werden standardmäßig ausgeblendet, sofern Sie nicht ausdrücklich gekennzeichnet sonst.
Sagen, dass die nicht freigegebenen Objekt ist
libnonshared.a
und die angeblich versteckte symbol istfoo
. Ausführung:Informationen über die Symbole in
libnonshared.a
. In der Ausgabe suchen Sie nach dem Eintrag fürfoo
. Enthält Sie den tag.hidden
? - z.B.Dieser Eintrag sagt, dass
foo
ist zu einem globalen symbol (markiertg
- das ist der Grund, warum der linker ist in der Lage, es zu sehen) aber es ist verborgen dynamische Gestänge.Wenn dies entpuppt sich der Fall sein, dann müssen Sie zu gehen und zu beheben das bauen von
libnonshared.a
so, dass es nicht versteckenfoo
.Wenn nicht, dann bin ich überfragt.
InformationsquelleAutor der Antwort Mike Kinghan