2009-06-29 3 views
0

Je dois implémenter une classe Java qui utilise JNI pour contrôler une imprimante fiscale dans XUbuntu 8.10 avec sun-java6-jdk installé.g ++ versionnement des symboles. Réglez-le sur GCC_3.0 en utilisant la version 4 de g ++

La structure est la suivante:

charges EpsonDriver.java libEpson.so

libEpson est lié dynamiquement avec EpsonFiscalProtocol.so (fourni par Epson, aucune source disponible) et Pthread

J'utilise javah pour générer le fichier d'en-tête, et le code compile. Ensuite, je mets le libEpson.so dans $ JAVA_HOME/jre/lib/i386 et EpsonDriver.java utilise cependant une statique initializar

System.loadLibrary("libEpson") 

Que fonctionne, quand je tente d'utiliser l'une des méthodes que je reçois un Exception insatisfiedLinkError.

Il y a quelque temps, un collègue de travail a fait une version qui fonctionne, et en utilisant objdump -Dslx j'obtenu ce qui suit:

Program Header: 
    LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12 
     filesz 0x0000ccc4 memsz 0x0000ccc4 flags r-x 
    LOAD off 0x0000d000 vaddr 0x0000d000 paddr 0x0000d000 align 2**12 
     filesz 0x00000250 memsz 0x00044a5c flags rw- 
DYNAMIC off 0x0000d014 vaddr 0x0000d014 paddr 0x0000d014 align 2**2 
     filesz 0x000000f0 memsz 0x000000f0 flags rw- 
    NOTE off 0x000000d4 vaddr 0x000000d4 paddr 0x000000d4 align 2**2 
     filesz 0x00000024 memsz 0x00000024 flags r-- 
    STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2 
     filesz 0x00000000 memsz 0x00000000 flags rw- 

Dynamic Section: 
    NEEDED    EpsonFiscalProtocol.so 
    NEEDED    libpthread.so.0 
    NEEDED    libstdc++.so.6 
    NEEDED    libm.so.6 
    NEEDED    libc.so.6 
    SONAME    libcom_tichile_jpos_EpsonSerialDriver.so 
    INIT     0x00007254 
    FINI     0x0000ba08 
    GNU_HASH    0x000000f8 
    STRTAB    0x00001f50 
    SYMTAB    0x00000ae0 
    STRSZ    0x00002384 
    SYMENT    0x00000010 
    PLTGOT    0x0000d108 
    PLTRELSZ    0x00000008 
    PLTREL    0x00000011 
    JMPREL    0x0000724c 
    REL     0x000045c4 
    RELSZ    0x00002c88 
    RELENT    0x00000008 
    TEXTREL    0x00000000 
    VERNEED    0x00004564 
    VERNEEDNUM   0x00000002 
    VERSYM    0x000042d4 
    RELCOUNT    0x000000ac 

Version References: 
    required from libstdc++.so.6: 
    0x056bafd3 0x00 05 CXXABI_1.3 
    0x08922974 0x00 04 GLIBCXX_3.4 
    required from libc.so.6: 
    0x0b792650 0x00 03 GCC_3.0 
    0x0d696910 0x00 02 GLIBC_2.0 

Dans le fichier récemment compilé je reçois:

Program Header: 
    LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12 
     filesz 0x00005300 memsz 0x00005300 flags r-x 
    LOAD off 0x00005300 vaddr 0x00006300 paddr 0x00006300 align 2**12 
     filesz 0x00000274 memsz 0x00010314 flags rw- 
DYNAMIC off 0x00005314 vaddr 0x00006314 paddr 0x00006314 align 2**2 
     filesz 0x000000e0 memsz 0x000000e0 flags rw- 
EH_FRAME off 0x00004a00 vaddr 0x00004a00 paddr 0x00004a00 align 2**2 
     filesz 0x00000154 memsz 0x00000154 flags r-- 

Dynamic Section: 
    NEEDED    libstdc++.so.5 
    NEEDED    libm.so.6 
    NEEDED    libgcc_s.so.1 
    NEEDED    libc.so.6 
    SONAME    EpsonFiscalProtocol.so 
    INIT     0x00001cb4 
    FINI     0x00004994 
    HASH     0x000000b4 
    STRTAB    0x00000da4 
    SYMTAB    0x000004f4 
    STRSZ    0x00000acf 
    SYMENT    0x00000010 
    PLTGOT    0x0000640c 
    PLTRELSZ    0x00000270 
    PLTREL    0x00000011 
    JMPREL    0x00001a44 
    REL     0x000019dc 
    RELSZ    0x00000068 
    RELENT    0x00000008 
    VERNEED    0x0000198c 
    VERNEEDNUM   0x00000002 
    VERSYM    0x00001874 
    RELCOUNT    0x00000004 

Version References: 
    required from libstdc++.so.5: 
    0x056bafd2 0x00 04 CXXABI_1.2 
    required from libc.so.6: 
    0x09691f73 0x00 03 GLIBC_2.1.3 
    0x0d696910 0x00 02 GLIBC_2.0 

Je soupçonne que la différence principale est le symbole GCC_3.0

Je compile libcom_tichile_EpsonSerialDriver.so avec la commande suivante (de la mémoire comme je ne suis pas au travail en ce moment)

g++ -Wl,-soname=.... -shared -I/*jni libraries*/ -o libcom_tichile_jpos_EpsonSerialDriver -lEpsonFiscalProtocol -lpthread 

Existe-t-il un moyen de dire à g ++ d'utiliser cette version de symbole? Ou une idée sur la façon de le faire fonctionner?

EDIT: J'ai une autre version non-travail avec la décharge followin:

Program Header: 
    LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12 
     filesz 0x0000bf68 memsz 0x0000bf68 flags r-x 
    LOAD off 0x0000cc0c vaddr 0x0000cc0c paddr 0x0000cc0c align 2**12 
     filesz 0x000005e8 memsz 0x00044df0 flags rw- 
DYNAMIC off 0x0000cc20 vaddr 0x0000cc20 paddr 0x0000cc20 align 2**2 
     filesz 0x000000f8 memsz 0x000000f8 flags rw- 
EH_FRAME off 0x0000b310 vaddr 0x0000b310 paddr 0x0000b310 align 2**2 
     filesz 0x000002bc memsz 0x000002bc flags r-- 
    STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2 
     filesz 0x00000000 memsz 0x00000000 flags rw- 
    RELRO off 0x0000cc0c vaddr 0x0000cc0c paddr 0x0000cc0c align 2**0 
     filesz 0x000003f4 memsz 0x000003f4 flags r-- 

Dynamic Section: 
    NEEDED    EpsonFiscalProtocol.so 
    NEEDED    libpthread.so.0 
    NEEDED    libstdc++.so.6 
    NEEDED    libm.so.6 
    NEEDED    libgcc_s.so.1 
    NEEDED    libc.so.6 
    SONAME    libcom_tichile_jpos_EpsonSerialDriver.so 
    INIT     0x000055d8 
    FINI     0x0000a968 
    HASH     0x000000f4 
    GNU_HASH    0x00000a30 
    STRTAB    0x00002870 
    SYMTAB    0x00001410 
    STRSZ    0x00002339 
    SYMENT    0x00000010 
    PLTGOT    0x0000cff4 
    PLTRELSZ    0x00000168 
    PLTREL    0x00000011 
    JMPREL    0x00005470 
    REL     0x00004ea8 
    RELSZ    0x000005c8 
    RELENT    0x00000008 
    VERNEED    0x00004e38 
    VERNEEDNUM   0x00000002 
    VERSYM    0x00004baa 
    RELCOUNT    0x00000001 

Version References: 
    required from libstdc++.so.6: 
    0x056bafd3 0x00 05 CXXABI_1.3 
    0x08922974 0x00 03 GLIBCXX_3.4 
    required from libc.so.6: 
    0x09691f73 0x00 06 GLIBC_2.1.3 
    0x0d696914 0x00 04 GLIBC_2.4 
    0x0d696910 0x00 02 GLIBC_2.0 

Maintenant, je pense que la principale différence est dans le symbole GCC_3.0/ABI

EDIT: Heureusement, un collègue de travail trouvé un moyen de parler à l'imprimante en utilisant Java

+0

Y at-il d'autres détails donnés avec l'exception insatisfiedLinkError. Comme quel symbole, version ou bibliothèque est manquant? Il est difficile de vous donner une réponse correcte avec des informations incomplètes. –

+0

Non, il n'y a pas d'informations supplémentaires dans la trace de la pile Java. Je soupçonne qu'il existe une sorte d'incompatibilité dans le lien entre libcom_tichile_jpos_EpsonSerialDriver.so et EpsonFiscalProtocol.so Si je supprime le fichier .so, alors java se plaint qu'il ne peut pas charger la bibliothèque. La fonction signatura est la même dans la version de travail et dans la version qui ne fonctionne pas. Donc je suis coincé .. – Ismael

Répondre

2

Non. Ils sont incompatibles. Vous devez utiliser une ancienne version de g ++. De plus, le différent est à libstdc++.so.5 et libstdc++.so.6.

+0

J'ai pensé quelque chose comme ça. Est-ce un problème que EpsonFiscalProtocol.so dépend de libstdC++. So.6? – Ismael

+0

libstdC++. So.6 => GCC 3.4/4.0; libstdC++. so.5 => GCC 3.3. La version de votre fichier .so doit correspondre à votre fichier exécutable. (btw, 'ldd' est beaucoup plus propre que' objdump') –

+0

Je vais essayer aujourd'hui avec gcc 3.4. J'ai utilisé objdump parce que j'ai besoin de comparer les symboles (et je ne connaissais pas les cordes coomand), mais j'ai utilisé 'ldd' et spécialement' ldd -r'' – Ismael

Questions connexes