nviennot / jd-core-java

Java Library for JD-Core, a java decompiler
257 stars 107 forks source link

java.lang.UnsatisfiedLinkError: /tmp/libjd-intellij4666658878690819195.so: /tmp/libjd-intellij4666658878690819195.so: undefined symbol: zlibVersion #29

Closed rightm closed 7 years ago

rightm commented 7 years ago

java -jar jd-core-java-1.2.jar /home/tmp/27c26076-48a4-4dee-9617-906f3d358e95/classes.jar /home/tmp/27c26076-48a4-4dee-9617-906f3d358e95/classes Exception in thread "main" java.lang.UnsatisfiedLinkError: /tmp/libjd-intellij4666658878690819195.so: /tmp/libjd-intellij4666658878690819195.so: undefined symbol: zlibVersion at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1939) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1864) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1825) at java.lang.Runtime.load0(Runtime.java:792) at java.lang.System.load(System.java:1059) at com.jd.util.NativeUtils.loadLibraryFromJar(NativeUtils.java:94) at jd.ide.intellij.JavaDecompiler.(JavaDecompiler.java:9) at jd.core.Decompiler.(Decompiler.java:18) at jd.core.Main.main(Main.java:40)

rightm commented 7 years ago

i try it on ubuntu will be ok ,but failed on centos .Maybe it is something different .....

ghost commented 6 years ago

I got a similar error with Eclipse instead of IntelliJ: java.lang.UnsatisfiedLinkError: .../eclipse/configuration/org.eclipse.osgi/bundles/1174/1/.cp/lib/linux/x86/libjd-eclipse.so: .../eclipse/configuration/org.eclipse.osgi/bundles/1174/1/.cp/lib/linux/x86/libjd-eclipse.so: undefined symbol: zlibVersion

The following fixed it for me (I'm using a 32-bit JRE):

LD_PRELOAD=/lib/i386-linux-gnu/libz.so.1.2.8
export LD_PRELOAD

Why does this work?

$ ldd .../eclipse/configuration/org.eclipse.osgi/bundles/1174/1/.cp/lib/linux/x86/libjd-eclipse.so
        linux-gate.so.1 =>  (0xf778d000)
        libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf73df000)
        libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf738a000)
        libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf736d000)
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf71b7000)
        /lib/ld-linux.so.2 (0x565d4000)

This shows that the jd shared library is NOT explicitly linked against libz but expected the symbols from libz to be known to dlsym. There are two ways to achieve that these symbols are present:

The latter is what my workaround does.

The real fix would be to rebuild libjd, passing -lz on the link command line.