Je suis en train de créer une application Mac OS X destinée à intégrer Python. Mon application est techniquement un bundle (c'est-à-dire que son exécutable principal est MH_BUNDLE); c'est un plug-in pour une autre application. Je voudrais l'intégrer statiquement, mais je veux pouvoir charger les extensions dynamiquement.La recherche de symbole dynamique échoue avec Python statiquement incorporé sous Mac OS X
J'ai fait le texte suivant: J'inclus une bibliothèque (-force_load path/to/libpython2.7.a
), aussi réexporté tous les symboles Python (-exported_symbol_list path/to/list
), et a ajouté le -u _PyMac_Error
, que je suis en utilisant this linking advice. Le bundle se charge très bien, tout le code Python interne semble fonctionner, mais il échoue lorsqu'il il tente d'importer une bibliothèque dynamique (time.so
) avec le message suivant:
Traceback (most recent call last):
...
ImportError: dlopen(/<stripped>/time.so, 2): Symbol not found: _PyExc_OverflowError
Referenced from: /<stripped>/time.so
Expected in: dynamic lookup
Ce symbole est une partie de l'API Python et ça doit être déjà dans mon paquet. Je peux vérifier ceci:
nm -g Build/Debug/pyfm | grep _PyExc_OverflowError
00172884 D _PyExc_OverflowError
0019cde0 D _PyExc_OverflowError
(Il est énuméré deux fois parce que j'ai deux architectures, i386 et ppc).
Le time.so
ne fait référence à rien, qui, comme je le comprends, est par la conception:
otool -L "/<stripped>/time.so"
/<stripped>/time.so (architecture ppc):
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.11)
/<stripped>/time.so (architecture i386):
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.11)
Mon problème semble être similaire à this, mais il est l'inverse: je statiquement Python lien , alors que l'autre affiche l'a reliée dynamiquement (nos plateformes sont différentes aussi). Pour lui, la liaison statique a résolu le problème.
Pourquoi ne trouve-t-il pas le symbole?
Mise à jour. Je suppose que cela arrive parce que l'application principale charge ses plug-ins (et donc mon bundle) avec RTLD_LOCAL
.