rpath = $ ORIGIN ne pas avoir l'effet désiré?
Question
J'ai un « CeeloPartyServer » binaire qui doit trouver libFoundation.so lors de l'exécution, sur une machine FreeBSD. Ils sont tous les deux dans le même répertoire. Je compile (sur une autre plate-forme, en utilisant un compilateur croisé) CeeloPartyServer utilisant l'indicateur de liaison « -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"
Pourquoi pas trouver la bibliothèque lorsque je tente de l'exécuter? Ma ligne exacte de liaison est: -lm -lmysql -rpath = $ ORIGIN. Je suis assez sûr que je n'ai pas échapper \ $ ou quelque chose comme ça depuis mon analyse readelf ne montre en effet que rpath bibliothèque est fixé à $ ORIGIN. Qu'est-ce que je manque?
La solution
Je suppose que vous utilisez gcc et binutils.
Si vous faites
readelf -d CeeloPartyServer | grep ORIGIN
Vous devez retourner la ligne RPATH vous avez trouvé ci-dessus, mais vous devriez aussi voir quelques entrées sur les drapeaux. Ce qui suit est d'une bibliothèque que je construit.
0x000000000000000f (RPATH) Library rpath: [$ORIGIN/../lib]
0x000000000000001e (FLAGS) ORIGIN
0x000000006ffffffb (FLAGS_1) Flags: ORIGIN
Si vous ne voyez pas une sorte d'entrées FLAGS, vous avez probablement pas dit l'éditeur de liens pour marquer l'objet comme nécessitant un traitement d'origine. Avec binutils ld, vous faites cela en passant le drapeau -z origin
.
Je suppose que vous utilisez gcc pour conduire le lien, donc dans ce cas, vous devrez passer par le drapeau compilateur en ajoutant -Wl,-z,origin
à votre ligne de lien gcc.
Autres conseils
En fonction du nombre de couches ce drapeau passe à travers avant l'éditeur de liens voit, vous devrez peut-être utiliser $$ORIGIN
ou même \$$ORIGIN
. Vous saurez que vous avez raison quand readelf
montre un en-tête de RPATH qui ressemble à $ORIGIN/../lib
ou similaire. Le $ supplémentaire et la barre oblique inverse sont juste pour empêcher le $ d'être traitées par d'autres outils de la chaîne.
\ $ \ ORIGINE si vous utilisez chrpath et $ \ \ $ ORIGIN si vous fournissez directement dans LDFLAGS