ld: utilisant -rpath,$ORIGIN À l'intérieur de la bibliothèque générale /Récursif/
Je viens de faire un exemple de base d'utiliser l'option
ld de
https://coderoad.ru/6311016/
/Voir la 2e réponse de la version de travail/. J'essaie de créer un exemple , Où
fait référence à
, qui fait à son tour référence à
, Tout en utilisant
et
.
La structure de fichier du temps d'exécution est comme suit:
project/
lib/
dir/
sub/
bar.so
foo.so
run/
main.run
/Ne peut pas construire/
Je suis en train de bâtir foo.so par:
Qui est parfaitement construit.
Peut-être même trouvé
.
Cependant, quand j'essaie de crier
de
,
Impossible de trouver bar.so.
Je suis en train de bâtir main.so par:
Cela fonctionne parfaitement parfaitement si une autre version est utilisée
, qui n'est pas une liaison récursive. /Lignes rassasiantes B. make.sh, Dans le projet ci-dessous pour vérifier/.
Cependant, en utilisant l'habituel
, Je reçois cette erreur lors de la construction
:
/usr/bin/ld: Attention: bar.so, Obligatoire lib/dir/foo.so, pas trouvé /Essayer d'utiliser -rpath ou -rpath-link/
Donc, mes questions sont les suivantes ::
Li est autorisé
à l'intérieur foo.so dans
/Où
/ ou
/Où
/Fichier exécutable la liaison//?
ldd , apparemment indique que cela
, Ce qui semble être le meilleur moyen /Bien que j'ai essayé de supposer à la fois/.
Comment puis-je leur faire les attacher /Garder la possibilité de bouger/ - De préférence sans utilisation
.
Vous pouvez télécharger le projet
http://dl.dropbox.com/u/319906 ... t.zip
. C'est tellement simple que je peux faire. 4 Brèves sources et script.
Après avoir passé juste courir
de
.
Noter:
j'utilise
. Ça ne devrait rien changer , sauf que les bibliothèques sont appelées comme
au lieu
, et lunk de
au lieu
.
-rpath
ld de
$ORIGIN
https://coderoad.ru/6311016/
/Voir la 2e réponse de la version de travail/. J'essaie de créer un exemple , Où
main.run
fait référence à
foo.so
, qui fait à son tour référence à
bar.so
, Tout en utilisant
rpath
et
$ORIGIN
.
La structure de fichier du temps d'exécution est comme suit:
project/
lib/
dir/
sub/
bar.so
foo.so
run/
main.run
/Ne peut pas construire/
Je suis en train de bâtir foo.so par:
g++ -c -o obj/foo.o src/foo.cpp -fPIC
g++ -shared -o lib/dir/foo.so obj/foo.o -Wl,-soname,foo.so -Wl,-rpath,'$ORIGIN/sub' -Llib/dir/sub -l:bar.so
Qui est parfaitement construit.
ldd lib/dir/foo.so
Peut-être même trouvé
bar.so
.
Cependant, quand j'essaie de crier
main.run
de
foo.so
,
foo.so
Impossible de trouver bar.so.
Je suis en train de bâtir main.so par:
g++ -c -o obj/main.o src/main.cpp
g++ -o run/main.run obj/main.o -Wl,-rpath,'$ORIGIN/../lib/dir' -Llib/dir -l:foo.so
Cela fonctionne parfaitement parfaitement si une autre version est utilisée
foo.so
, qui n'est pas une liaison récursive. /Lignes rassasiantes B. make.sh, Dans le projet ci-dessous pour vérifier/.
Cependant, en utilisant l'habituel
foo.so
, Je reçois cette erreur lors de la construction
main.run
:
/usr/bin/ld: Attention: bar.so, Obligatoire lib/dir/foo.so, pas trouvé /Essayer d'utiliser -rpath ou -rpath-link/
Donc, mes questions sont les suivantes ::
Li est autorisé
$ORIGIN
à l'intérieur foo.so dans
project/lib/dir
/Où
foo.so
/ ou
project/run
/Où
main.run
/Fichier exécutable la liaison//?
ldd , apparemment indique que cela
project/lib/dir
, Ce qui semble être le meilleur moyen /Bien que j'ai essayé de supposer à la fois/.
Comment puis-je leur faire les attacher /Garder la possibilité de bouger/ - De préférence sans utilisation
-rpath-link
.
Vous pouvez télécharger le projet
http://dl.dropbox.com/u/319906 ... t.zip
. C'est tellement simple que je peux faire. 4 Brèves sources et script.
Après avoir passé juste courir
./make.sh
de
project/
.
Noter:
j'utilise
-l:
. Ça ne devrait rien changer , sauf que les bibliothèques sont appelées comme
foo.so
au lieu
libfoo.so
, et lunk de
-l:foo.so
au lieu
-lfoo
.
Aucun résultat connexe trouvé
Invité:
Pour répondre aux questions, connectez-vous ou registre
6 réponses
Babette
Confirmation de:
L'Iran
Pour la compilation main.run. La liaison statique essaie réellement d'ouvrir des fichiers, dont le nom littéral ressemble à "$ORIGIN/lib/dir/sub/bar.so", Entre autres 20-30. /En d'autres termes, il recherche un vrai catalogue nommé
. Sérieusement./
Il semble également rechercher le chemin de liaison RPATH pour le nom "lib/dir/sub/bar.so", pas seulement "bar.so". Je ne sais pas pourquoi.
En tout cas, c'est un lien pour main.run, Qui fonctionne pour moi:
Il est identique au tien, mais avec inset
.
[une addition]
Eh bien, je pense que je comprends ce qui se passe. Premier, liant statique /GNU ld/ Juste n'observe pas $ORIGIN Dans les bibliothèques avec lesquelles il se lie.
Deuxièmement, comportement lorsqu'il est utilisé
contre
très différent.
Lancer
sur
. Dans votre assemblée, cela montre la dépendance à "lib/dir/sub/bar.so". C'est pourquoi installer des liens de RPATH à "." Corrige l'assemblage main.run; Il provoque une liaison statique de rechercher "." pour "lib/dir/sub/bar.so", Qu'il trouve.
Si vous renommez bar.so dans libbar.so et cravate foo.so utilisant
au lieu
, Le même readelf montrera que foo.so Dépend maintenant de "libbar.so" /Sans composante de chemin/. Avec l'aide de cette foo.so Vous pouvez faire le lien main.run Travailler en utilisant
, comme prévu , Si vous saviez que la lieur statique n'observe tout simplement pas $ORIGIN.
Au fait, je ne vois pas la syntaxis
, documenté n'importe où dans le manuel GNU ld. Juste hors de curiosité, comment vous êtes-vous arrivé?
En supposant que ceci est une fonction prise en charge, c'est un peu comme une erreur /-l:bar.so Crée une dépendance ot lib/dir/sub/bar.so Au lieu de simple bar.so/. Vous pouvez soit faire face à cette erreur en installant rpath-link sur '.' pour main.run, soit renommer du matériel habituel /libxxx.so/.
Christine
Confirmation de:
http://linux.die.net/man/8/ld-linux
:
$ORIGIN et rpath
ld.so Comprend la chaîne $ORIGIN /ou équivalent ${ORIGIN}/ dans
Caractéristiques rpath /DT_RPATH ou DT_RUNPATH/ En tant que catalogue
, Contenant un fichier d'application exécutable. Ainsi, une application située dans
somedir/app, peut être compilé avec gcc-Wl,-rpath,'$ORIGIN/../lib'
, afin qu'il trouve la bibliothèque générale associée dans somedir/lib indépendamment
d'où somedir Situé dans la hiérarchie des répertoires. Cela facilite la tâche
créature "turn-key" applications qui n'ont pas besoin
établir dans des répertoires spéciaux, mais vous pouvez plutôt décompresser
Tout catalogue et trouvez toujours vos propres bibliothèques générales.
Ainsi, en réponse à votre première question, il n'y a qu'une seule valeur pour
:
.
Par conséquent, la réponse à votre deuxième question devrait être d'utiliser la commande suivante pour communiquer.
:
Gaspard
Confirmation de:
Avant de courir
. Cela fonctionne bien et il trouve la dépendance du 1er niveau. Soyez prudent avec des citations simples et doubles lorsque vous traitez avec ce type de problèmes d'expansion de macros.
Deuxièmement, si vous courez
Dans un fichier ou une bibliothèque binaire, vous pouvez voir le titre. RPATH, qu'il contient réellement. Quand je cours
, Il me montre ça.
RPATH
${ORIGIN}/../lib:${ORIGIN}/../usr/lib`
Je vous suggère de vérifier vos fichiers binaires pour voir ce qui est réellement dans le titre RPATH. Malheureusement, je ne pense pas que cela résoudra votre problème. C'est ce que je vois en courant
:
Comme vous pouvez le constater, la dépendance du premier niveau est correctement traitée.
, Mais la dépendance au deuxième niveau, c'est-à-dire des dépendances libpython, Retour aux bibliothèques système. Et oui, libpython a exactement le même titre RPATH dans votre fichier binaire. J'ai trouvé votre question quand google
, Essayer de résoudre mon problème de créer indépendamment de la distribution de paquets.
Ajouté plus tard
Titres
Vivant seulement le chemin FIRST, La bibliothèque souhaitée. S'ils ne les trouvent pas là-bas, le chargeur continue de rechercher des endroits ordinaires.
Il ne contient que la voie réelle de la bibliothèque trouvée à la suite de la recherche. Quand j'ai copié ces bibliothèques dans le catalogue
, Que tous fonctionnaient. En principe, il n'y a pas de moyen précis de trouver toutes les dépendances et de les copier, juste
Et une analyse de cette sortie.
Giselle
Confirmation de:
Pour tout chemin qui utilisera l'extension ORIGIN. Par exemple:
ne se déroulera pas
dans les chemins spécifiés en utilisant
, ou des chemins qu'il supprime de RPATH Sous-section. Dans l'exemple ci-dessus
dépend de
; Lors de la liaison
Essayer de trouver
, En utilisant littéral/Chaîne inachevée
, B. B. intégré libmylib2.so.
sera pendant l'exécution, mais pas
.
Il n'utilise pas non plus les chemins spécifiés avec
Trouver sur les pages de dépendance montrées/M | H./.
Catherine
Confirmation de:
https://github.com/zym1010/til ... ct.sh
. En principe, utilisez un supplément
sans pour autant
, car
Ne comprenez pas du tout
.
Quant à vos questions.
ne fonctionne que pendant l'exécution et il w.r.t. Chaque bibliothèque. Ainsi, différentes bibliothèques générales ont différents
.
J'ai peur , Ce qui est préférable d'ajouter
, Et cela n'affectera pas votre portabilité, car ils sont relatifs et n'existeront pas dans le fichier exécutable final, comme je l'ai montré dans ma version.
Outre,
https://github.com/zym1010/til ... ng.md
. J'espère que cela aidera.
Hannah
Confirmation de:
AFAIK commencer avec
. rpath En fonction de l'ajout à la recherche.
c'est à dire.
trouver
, puis lisez RPATH dans
Alors trouver
Voici mon stack overflow question:
https://coderoad.ru/52647141/
Et voici mes recherches sur diverses distributions /conteneur intérieur docker/ Pour tester diverses versions binutils
https://github.com/Mizux/SecondaryDependency
Remarque: jetez un coup d'œil au magazine Trevis-CI ...