2 votes

Le chargement de dylib en python échoue sur macOS Big Sur : `Symbol not found : ___addtf3`

J'ai des problèmes lorsque je charge un fichier personnalisé mylib.dylib en python3.7 sur Mac OS X Big Sur 11.1 :

OSError                                   Traceback (most recent call last)
<ipython-input-7-21ad9f6d803b> in <module>
     12 try:
---> 13     mylib = ctypes.CDLL(mylib_path)
     14 except OSError:

~/opt/anaconda3/lib/python3.7/ctypes/__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error)
    363         if handle is None:
--> 364             self._handle = _dlopen(self._name, mode)
    365         else:

OSError: dlopen(mylib.dylib, 6): Symbol not found: ___addtf3
  Referenced from: /usr/local/opt/gcc/lib/gcc/10/libquadmath.0.dylib
  Expected in: flat namespace
 in /usr/local/opt/gcc/lib/gcc/10/libquadmath.0.dylib

Cependant exactement la même chose mylib.dylib se charge avec succès avec exactement ce code python sur Mac OS X 10.15 Catalina. En outre, exactement la même chose mylib Le binaire fonctionne avec succès sur mon Big Sur 11.1 lorsqu'il est compilé comme un exécutable, et non comme une bibliothèque partagée.

Description détaillée, étape par étape :

  1. Je construis un code C++ dans une bibliothèque partagée en utilisant bazel sur Mac OS X Big Sur 11.1 :

    bazel build :mylib.dylib

BUILD est :

cc_binary(
    name = "mylib.dylib",
    srcs = ["mylib.cc", "mylib.h", "mylib_external.cc", "mylib_external.h"],
    deps = [
        ...some dependencies...
    ],
    linkshared = 1,
)

.bazelrc est :

# Basic build settings
build --jobs 128
build --define='absl=1'
build --enable_platform_specific_config

# macOS
build:macos --cxxopt=-std=c++17
build:macos --host_cxxopt=-std=c++17
build:macos --copt=-w

# Sets the default Apple platform to macOS.
build --apple_platform_type=macos

# Allow debugging with XCODE
build --apple_generate_dsym

build:darwin_x86_64 --apple_platform_type=macos
build:darwin_x86_64 --macos_minimum_os=10.12
build:darwin_x86_64 --cpu=darwin_x86_64
  1. J'essaie ensuite de le charger dans python3.7 :

    import sys, platform import ctypes, ctypes.util

    mylib_path = ctypes.util.find_library("mylib") if not mylib_path: print("Unable to find the specified library.") sys.exit()

    try: mylib = ctypes.CDLL(mylib_path) except OSError: print("Unable to load the specified library.") sys.exit()

Et ça me donne :

OSError                                   Traceback (most recent call last)
<ipython-input-7-21ad9f6d803b> in <module>
     12 try:
---> 13     mylib = ctypes.CDLL(mylib_path)
     14 except OSError:

~/opt/anaconda3/lib/python3.7/ctypes/__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error)
    363         if handle is None:
--> 364             self._handle = _dlopen(self._name, mode)
    365         else:

OSError: dlopen(mylib.dylib, 6): Symbol not found: ___addtf3
  Referenced from: /usr/local/opt/gcc/lib/gcc/10/libquadmath.0.dylib
  Expected in: flat namespace
 in /usr/local/opt/gcc/lib/gcc/10/libquadmath.0.dylib

Une solution possible au même problème a été discutée dans ce problème GitHub mais pour moi, changer DYLD_LIBRARY_PATH ne fonctionne pas.

  1. J'ai essayé de définir le chemin d'accès à libgcc_ext.10.4.dylib sur libquadmath.0.dylib :

    install_name_tool -change /usr/lib/libSystem.B.dylib /usr/local/opt/gcc/lib/gcc/10/libgcc_ext.10.4.dylib /usr/local/opt/gcc/lib/gcc/10/libquadmath.0.dylib

Ça pourrait aider parce qu'il n'y a pas /usr/lib/libSystem.B.dylib sur Big Sur 11.1 (donc ce fichier n'est pas utilisé je suppose), mais au lieu de cela il me donne une nouvelle erreur :

OSError                                   Traceback (most recent call last)
<ipython-input-7-21ad9f6d803b> in <module>
     12 try:
---> 13     mylib = ctypes.CDLL(mylib_path)
     14 except OSError:

~/opt/anaconda3/lib/python3.7/ctypes/__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error)
    363         if handle is None:
--> 364             self._handle = _dlopen(self._name, mode)
    365         else:

OSError: dlopen(mylib.dylib, 6): Library not loaded: /usr/local/opt/gcc/lib/gcc/10/libgcc_ext.10.4.dylib
  Referenced from: /usr/local/opt/gcc/lib/gcc/10/libquadmath.0.dylib
  Reason: no suitable image found.  Did find:
    /usr/local/opt/gcc/lib/gcc/10/libgcc_ext.10.4.dylib: mach-o, but wrong filetype
    /usr/local/Cellar/gcc/10.2.0/lib/gcc/10/libgcc_ext.10.4.dylib: mach-o, but wrong filetype
  1. J'ai aussi a essayé a brew reinstall gcc Avant cette action, il y avait /usr/local/libSystem.B.dylib au lieu de flat namespace dans le numéro actuel.

  2. Il y a quelques problèmes connexes : scipy , scipy.special , scipy._fblas , gdal2 . Leurs solutions ne sont d'aucune utilité, car elles consistent généralement à réinstaller les paquets, alors que j'ai mon propre paquet.

  3. Finalement, j'ai essayé de mettre CC=clang/g++/g++-10 quand construire avec bazel . Malheureusement, cela n'a pas fonctionné.

Toute suggestion ou réflexion serait très appréciée. Merci d'avance

0voto

Ilya Zakharkin Points 21

Après @n. m. des commentaires, j'ai essayé de lier libgcc_s au lieu de libSystem :

install_name_tool -change "/usr/lib/libSystem.B.dylib" "/usr/local/opt/gcc/lib/gcc/10/libgcc_s.1.dylib" mylib.dylib

Ça m'a donné une autre erreur : Symbol not found: ___emutls_get_address de la libopenblas. J'ai cherché sur Google et j'ai trouvé cette réponse SO et l'a fait :

brew link --overwrite gcc

Alors la seule chose que j'ai faite est de reconstruire le mylib.dylib avec bazel avec exactement les mêmes règles que précédemment et ça a marché ! Maintenant la bibliothèque se charge dans python sans aucune erreur. Merci beaucoup.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X