Frage

Ich habe einen binären "Ceelopartyserver", der libFoundation finden muss. So zur Laufzeit auf einer FreeBSD -Maschine. Sie sind beide im selben Verzeichnis. Ich kompiliere (auf einer anderen Plattform mit einem Cross-Compiler) CeelopartyServer mit dem Linker-Flag "-rpath = $ Origin".

> readelf -d CeeloPartyServer |grep -i rpath
 0x0000000f (RPATH)                      Library rpath: [$ORIGIN]
> ls
CeeloPartyServer    Contents        Foundation.framework    libFoundation.so
> ./CeeloPartyServer 
/libexec/ld-elf.so.1: Shared object "libFoundation.so" not found, required by "CeeloPartyServer"

Warum findet es nicht die Bibliothek, wenn ich versuche, sie auszuführen? Meine genaue Linkerzeile lautet: -lm -lmysql -rpath = $ origin. Ich bin mir ziemlich sicher, dass ich nicht entkommen muss $ oder ähnliches, da meine Readelf -Analyse tatsächlich zeigt, dass die Bibliothek auf $ Origin eingestellt ist. Was vermisse ich?

War es hilfreich?

Lösung

Ich gehe davon aus, dass Sie GCC und Binutils verwenden.

Wenn Sie tun

readelf -d CeeloPartyServer | grep ORIGIN

Sie sollten die oben gefundene RPATH -Linie zurückbekommen, aber Sie sollten auch einige Einträge über Flags sehen. Das Folgende stammt aus einer Bibliothek, die ich gebaut habe.

0x000000000000000f (RPATH)              Library rpath: [$ORIGIN/../lib]
0x000000000000001e (FLAGS)              ORIGIN
0x000000006ffffffb (FLAGS_1)            Flags: ORIGIN

Wenn Sie keine Flags -Einträge sehen, haben Sie dem Linker wahrscheinlich nicht gesagt, dass er das Objekt als Ursprungsverarbeitung markieren soll. Mit Binutils LD tun Sie dies, indem Sie das übergeben -z origin Flagge.

Ich vermute, Sie verwenden GCC jedoch, um den Link zu steuern. In diesem Fall müssen Sie die Flagge durch den Compiler durch Hinzufügen übertragen -Wl,-z,origin zu Ihrer GCC -Linklinie.

Andere Tipps

Je nachdem, wie viele Ebenen diese Flagge durchlaufen, bevor der Linker es sieht, müssen Sie möglicherweise verwenden $$ORIGIN oder auch \$$ORIGIN. Sie werden wissen, dass Sie es richtig haben, wenn readelf zeigt einen RPATH -Header, der aussieht wie $ORIGIN/../lib oder ähnliches. Die zusätzlichen $ und der Backslash dienen nur dazu, zu verhindern, dass die $ von anderen Werkzeugen in der Kette verarbeitet werden.

$ Origin, wenn Sie Chrad und $ $ Origin verwenden, wenn Sie direkt in LDFLAGs bereitstellen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top