+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Invité de passage
    Inscrit en
    février 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : février 2007
    Messages : 2
    Points : 0
    Points
    0

    Par défaut utiliser une librairie partager 32bits sur python 64

    Bonjour,

    j'ai créer une librairie en c++ que j'ai partagé via Swig.
    je l'utilise sans problème sur une architecture 32 bits.

    je voudrai pouvoir utiliser ma librairie dans mon architecture 64 bits.
    la contrainte étant que ma librairie utilise des modules .so qui sont 32 bits et ne peuvent être compiler en 64.


    Est-ce possible ? Comment ?

    voici ce que j’utilise (version allégé) pour la création de ma lib partagé :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    # Création de la librairie partager Python
    ar rcs obj/linuxrel/libeconf.a obj/linuxrel/econf.o
     
     
    echo '/* econf.i */ 
    %module econf
    %{
    #include "../../econf.h"
    %}
    %include "../../econf.h"' > obj/linuxrel/econf.i 
     
    swig -python -c++ obj/linuxrel/econf.i 
     
    g++ -m32 -c -fPIC -I/usr/include/python2.6 \
    -I/usr/easyvalid/tools/Econf/Framework/framework_sdk_v1.4.7/include obj/linuxrel/econf_wrap.cxx 
     
    g++ -m32 -O3 -shared -L/usr/easyvalid/tools/Econf/Framework/framework_sdk_v1.4.7/bin -Lobj/linuxrel/ -lpython2.6 -Wl,-soname,_econf.so econf_wrap.o -leconf -lsndfile -lm -ldl -lpthread -lrt -o obj/linuxrel/_econf.so
    lors de l'import depuis python 64 j'obtient :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    [easyvalid@EasyValid linuxrel]$ python -m econf
    Traceback (most recent call last):
      File "/usr/lib64/python2.6/runpy.py", line 122, in _run_module_as_main
        "__main__", fname, loader, pkg_name)
      File "/usr/lib64/python2.6/runpy.py", line 34, in _run_code
        exec code in run_globals
      File "/usr/easyvalid/tools/Econf/Convert/obj/linuxrel/econf.py", line 25, in <module>
        _econf = swig_import_helper()
      File "/usr/easyvalid/tools/Econf/Convert/obj/linuxrel/econf.py", line 21, in swig_import_helper
        _mod = imp.load_module('_econf', fp, pathname, description)
    ImportError: /usr/easyvalid/tools/Econf/Convert/obj/linuxrel/_econf.so: wrong ELF class: ELFCLASS32

  2. #2
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    5 657
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 657
    Points : 8 555
    Points
    8 555

    Par défaut

    Salut,

    L'erreur:
    "ImportError: /usr/easyvalid/tools/Econf/Convert/obj/linuxrel/_econf.so: wrong ELF class: ELFCLASS32"
    est "systeme"....

    Comme l'espace d'adressage que l'OS propose à une bibliothèque 32 bits est sensiblement différent d'un 64 bits, je ne doute qu'un "OS" supporte un tel mélange - c'est compliqué... et il y a des solutions de contournement "possible" au niveau application qui en réduisent l'intérêt.
    Dans votre cas, la solution pourrait être d'installer un Python 32 bits dans un OS 64 bits... Si vous voulez absolument profiter d'un espace d'adressage 64bits et de l'ancienne bibliothèque, il devrait être "possible" d'interfacer les deux via un IPC quelconque (un process 64 bits qui cause avec un process 32 bits de façon plus ou moins proche).

    - W
    Architectures Post-Modernes

  3. #3
    Invité de passage
    Inscrit en
    février 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : février 2007
    Messages : 2
    Points : 0
    Points
    0

    Par défaut

    Merci @wiztricks pour votre réponse.

    Mon problème est que le programme python qui va importer la librairie "econf" est en 64 bits et utilise massivement le multithreading (au delà de la limite de 302 thread système en mode 32 bits), il me faut donc trouver une solution qui me permet d'importé cette lib 32 dans mon programme 64.

    Existe t'il une "passerelle" 64->32 ?

    ###### ######
    # P64 # --> passerelle --> # lib 32#
    ###### ######

    Merci

  4. #4
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    5 657
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 657
    Points : 8 555
    Points
    8 555

    Par défaut

    Salut,

    Citation Envoyé par the-atlantis Voir le message
    Existe t'il une "passerelle" 64->32 ?i
    On peut toujours faire une "passerelle", la question est de savoir si on pourra se contenter d'un pont en corde qui sera traversé de temps en temps par des humains ou s'il faut un truc genre aqueduc de Millau devant supporter le passage de XX tonnes.

    Ce sera un dialogue entre deux processus ou entre threads de processus différents. Ce sera donc "context switch" et "transferts de messages"... qui pourront être pénalisants côté temps de réponse.

    Après c'est du Python32 <-> Python64 ou du Python64 - DLL64bits <-> Process 32 bits.
    - W
    Architectures Post-Modernes

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •