8 votes

Comment trouver la bibliothèque partagée manquante ?

Lorsque j'utilise ldd sous Linux, il m'indique immédiatement s'il manque quelque chose, c'est-à-dire

ldd -d some_lib.so
    libexample.so => not found
    libex.2.so => not found
    libm.so.6 => /lib/libm.so.6 (0xf5860000)
    libdl.so.2 => /lib/libdl.so.2 (0xf785b000)
    libc.so.6 => /lib/libc.so.6 (0xf78a9000)
    /lib/ld-linux.so.2 (0x46b4c000)

Sous Mac OS, il n'y a pas de ldd et les gens recommandent d'utiliser otool -L mais cela montre quelles bibliothèques partagées sont attendues, et non pas si elles sont présentes ou non. Une autre approche consisterait à utiliser dtruss Mais cela nécessite sudo, et d'après mon expérience, l'application se comporte très différemment lorsqu'elle est traitée, et elle échoue pour une raison totalement différente (et avant qu'elle n'essaie de charger la .dylib gênante).

Si vous soupçonnez l'absence d'une bibliothèque partagée, quelle est l'approche standard pour savoir de laquelle il s'agit sur le Mac ?

5voto

Jose Chavez Points 645

Le plus simple est d'exécuter le programme. Si la bibliothèque partagée est manquante, vous obtiendrez un résultat similaire à celui-ci :

dyld: Library not loaded: mylib.dylib
  Referenced from: /path/to/myprogram
  Reason: image not found
Abort trap: 6

Vous pouvez également exécuter la commande suivante :

objdump -r --dylibs-used /path/to/myprogram

Vous obtiendrez essentiellement le même résultat qu'avec l'option otool que vous avez mentionnée dans votre question (il y a de nombreuses années, Apple a remplacé l'ancienne chaîne d'outils par une chaîne basée sur llvm, de sorte qu'otool sur les versions récentes de MacOS appellera simplement objdump). Le programme liste les bibliothèques partagées qu'il attend - vous pouvez alors vérifier manuellement si vous avez effectivement ces fichiers. Par exemple, existe-t-il un fichier dans ce chemin avec ce nom, est-il lisible par votre utilisateur et contient-il une bibliothèque dynamique valide ?

5voto

nag0503 Points 7

L'éditeur de liens dynamiques dyld affiche tous les dylibs chargés si vous export (sh) ot setenv (csh) ces variables :

export DYLD_PRINT_LIBRARIES=1
export DYLD_PRINT_RPATHS=1
export DYLD_PRINT_TO_FILE=dyld.log
myprogram

Voici un exemple de dyld.log ; otool -L la dernière librairie "déchargée pour voir ce qu'elle veut lier.

...
dyld: loaded: /opt/local/mac/big/py3/lib/python3.7/site-packages/scikits/umfpack/__umfpack.cpython-37m-darwin.so
dyld: loaded: /opt/local/mac/big/SuiteSparse/lib/libumfpack.5.7.8.dylib
dyld: unloaded: /opt/local/mac/big/py3/lib/python3.7/site-packages/scikits/umfpack/__umfpack.cpython-37m-darwin.so

La page du manuel man dyld énumère des dizaines d'autres commutateurs.

Il devrait y avoir un meilleur moyen ...

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X