Skip to content

Z3 JNI library fails to load in Eclipse PDE environment #537

@gravemalte

Description

@gravemalte

When using JavaSMT with Z3 in an Eclipse PDE launch environment, the solver fails to initialize with the following exception:

org.sosy_lab.common.configuration.InvalidConfigurationException: The SMT solver Z3 is not available on this machine because of missing libraries ('long com.microsoft.z3.Native.INTERNALmkConfig()')..

Caused by: java.lang.UnsatisfiedLinkError: 'long com.microsoft.z3.Native.INTERNALmkConfig()' at com.microsoft.z3.Native.INTERNALmkConfig(Native Method) at com.microsoft.z3.Native.mkConfig(Native.java:895)

Steps to reproduce:

  1. Create an Eclipse plugin project.
  2. Include all necessary dependencies for JavaSMT and Z3.
  3. Include the native library bundle containing:
    • libz3.so
    • libz3java.so
  4. Launch the product via PDE (Run As → Eclipse Application) with a VM argument pointing to the bundle containing the native libs
  5. Attempt to create a solver context:
SolverContext context = SolverContextFactory.createSolverContext(SolverContextFactory.Solvers.Z3);
  1. Observe an exception throw:
org.sosy_lab.common.configuration.InvalidConfigurationException: The SMT solver Z3 is not available on this machine because of missing libraries ('long com.microsoft.z3.Native.INTERNALmkConfig()')..
...
Caused by: java.lang.UnsatisfiedLinkError: 'long com.microsoft.z3.Native.INTERNALmkConfig()' at com.microsoft.z3.Native.INTERNALmkConfig(Native Method) at com.microsoft.z3.Native.mkConfig(Native.java:895)

JavaSMT can't create the solver even though the native .so files are present and visible in /proc/<YOURPID>/maps or cat /proc/$(pgrep -f eclipse)/maps | grep z3.

When running the Eclipse PDE with LD_DEBUG=bindings you get the following output:

121431: /usr/lib/jvm/java-21-openjdk/bin/java: error: symbol lookup error: undefined symbol: JNI_OnLoad_z3 (fatal) 
121431: /usr/lib/jvm/java-21-openjdk/bin/java: error: symbol lookup error: undefined symbol: JNI_OnLoad_z3 (fatal) 
121431: /home/.../z3.bundle/lib/libz3.so: error: symbol lookup error: undefined symbol: JNI_OnLoad (fatal)

What's interesting here is, that JavaSMT tries to load an JNI symbol JNI_OnLoad in the libz3.so first, before loading libz3java.so (where the symbol is defined).

When using Z3 without JavaSMT (exactly the same setup but using the com.microsoft.z3.* API) everything works as expected.
I suspect a load issue where the libz3.so is first loaded before the libz3java.so.

I think the issue is how the common-lib does the library loading here: https://github.com/sosy-lab/java-common-lib/blob/main/src/org/sosy_lab/common/NativeLibraries.java#L174

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions