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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top