rpath = $ origin nicht gewünscht Effekt?
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?
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