Skip to content

JNI shared library - wrong location hardcoded, breaks execution #6

Open

Description

@mouse07410

When libopensc-PKCS11-x86_64.dylib is linked - it somehow gets the idea that libltdl.dylib is in /usr/local/lib, while in fact it is in /opt/local/lib:

$ ant -f build-without-ivy.xml 
Buildfile: /Users/uri/src/opensc-java-andreas/build-without-ivy.xml

compile:
    [mkdir] Created dir: /Users/uri/src/opensc-java-andreas/build/bin
    [mkdir] Created dir: /Users/uri/src/opensc-java-andreas/java/lib
    [javac] /Users/uri/src/opensc-java-andreas/build-without-ivy.xml:32: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 38 source files to /Users/uri/src/opensc-java-andreas/build/bin
    [javac] Note: /Users/uri/src/opensc-java-andreas/java/src/org/opensc/pkcs11/spi/PKCS11SignatureSpi.java uses or overrides a deprecated API.
    [javac] Note: Recompile with -Xlint:deprecation for details.
    [javac] Note: /Users/uri/src/opensc-java-andreas/java/src/org/opensc/pkcs11/PKCS11Provider.java uses unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.

dist:
    [mkdir] Created dir: /Users/uri/src/opensc-java-andreas/build/lib
      [jar] Building jar: /Users/uri/src/opensc-java-andreas/build/lib/opensc-java.jar
     [copy] Copying 5 files to /Users/uri/src/opensc-java-andreas/build/lib
   [delete] Deleting directory /Users/uri/src/opensc-java-andreas/build/bin

BUILD SUCCESSFUL
Total time: 2 seconds
$ otool -L build/lib/libopensc-PKCS11-x86_64.dylib 
build/lib/libopensc-PKCS11-x86_64.dylib:
    libopensc-PKCS11-0.4.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/local/lib/libltdl.7.dylib (compatibility version 11.0.0, current version 11.1.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
$ ll /usr/local/lib/libltdl.7.dylib
ls: /usr/local/lib/libltdl.7.dylib: No such file or directory
$ otool -L /opt/local/lib/libltdl.7.dylib
/opt/local/lib/libltdl.7.dylib:
    /opt/local/lib/libltdl.7.dylib (compatibility version 11.0.0, current version 11.1.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
$

As a result, programs that try to use it fail:

/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/bin/java -Didea.launcher.port=7534 "-Didea.launcher.bin.path=/Applications/IntelliJ IDEA 14.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/lib/tools.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Users/uri/SkyDrive/pkcs11Test/out/production/pkcs11Test:/Library/Java/Extensions/commons-logging-1.2.jar:/Library/Java/Extensions/opensc-java.jar:/Library/Java/Extensions/bcprov-ext-jdk15on-155.jar:/Library/Java/Extensions/junit-4.12.jar:/Applications/IntelliJ IDEA 14.app/Contents/lib/idea_rt.jar" com.intellij.rt.execution.application.AppMain burrow.pkcs11.PKCS11Test2
PKCS11Test2: setting up OpenSC-PKCS11 provider...
java.library.path = /Users/uri/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
Exception in thread "main" java.lang.UnsatisfiedLinkError: /Library/Java/Extensions/libopensc-PKCS11-x86_64.dylib: dlopen(/Library/Java/Extensions/libopensc-PKCS11-x86_64.dylib, 1): Library not loaded: /usr/local/lib/libltdl.7.dylib
  Referenced from: /Library/Java/Extensions/libopensc-PKCS11-x86_64.dylib
  Reason: image not found
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1837)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at org.opensc.pkcs11.PKCS11Provider.<clinit>(Unknown Source)
    at burrow.pkcs11.PKCS11Test2.setProvider(PKCS11Test2.java:27)
    at burrow.pkcs11.PKCS11Test2.main(PKCS11Test2.java:108)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

Activity

  1. mouse07410 commented on Aug 24, 2016

    @mouse07410
    Author

    On Mac OS X one can manually edit and fix the library path via

    $ install_name_tool -change /usr/local/lib/libltdl.7.dylib /opt/local/lib/libltdl.7.dylib build/lib/libopensc-PKCS11-x86_64.dylib
    $
    

    But I'd rather not resort to such hacks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions