Skip to content

cannot generate shared library #2193

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
uvilop opened this issue Feb 26, 2020 · 6 comments
Closed

cannot generate shared library #2193

uvilop opened this issue Feb 26, 2020 · 6 comments

Comments

@uvilop
Copy link

uvilop commented Feb 26, 2020

Describe GraalVM and your environment :

  • GraalVM version or commit id if built from source: 19.3.1
  • CE or EE: CE
  • Build Time or run time failure: build-time
  • JDK version: graalvm 19.3.1
  • Native compiler information:
    Run the following to capture compiler version
    • In windows: cl.exe
    • In macOS : cc -v
    • In Linux: gcc --version
**gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
**
  • Native linker information:
    Run the following to capture linker version
    • In windows: cl.exe
    • In macOS : cc -Wl,-v
    • In Linux: gcc -Wl,--version
**collect2 version 7.4.0**
  • OS and OS Version: ubuntu 18
  • Architecture: x64
  • The output of java -Xinternalversion:
 **OpenJDK 64-Bit Server VM (11.0.6+9-jvmci-19.3-b07) for linux-amd64 JRE (11.0.6+9-jvmci-19.3-b07), built on Jan 13 2020 20:43:28 by "buildslave" with gcc 7.3.0
**

Have you verified this issue still happens when using the latest snapshot?
You can find snapshot builds here: https://github.com/graalvm/graalvm-ce-dev-builds/releases

Describe the issue
A clear and concise description of the issue.

Describe the full native-image command

Capture full native-image command by running with the `--verbose` flag e.g.:
 native-image --verbose --no-server --shared -H:Name=libhellonative -H:Log=InvokeCC: -cp classes/
Executing [
/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/bin/java \
-XX:+UnlockExperimentalVMOptions \
-XX:+EnableJVMCI \
-Dtruffle.TrustAllTruffleRuntimeProviders=true \
-Dtruffle.TruffleRuntime=com.oracle.truffle.api.impl.DefaultTruffleRuntime \
-Dgraalvm.ForcePolyglotInvalid=true \
-Dgraalvm.locatorDisabled=true \
-Dsubstratevm.IgnoreGraalVersionCheck=true \
-Djava.lang.invoke.stringConcat=BC_SB \
--add-exports \
jdk.internal.vm.ci/jdk.vm.ci.runtime=ALL-UNNAMED \
--add-exports \
jdk.internal.vm.ci/jdk.vm.ci.code=ALL-UNNAMED \
--add-exports \
jdk.internal.vm.ci/jdk.vm.ci.aarch64=ALL-UNNAMED \
--add-exports \
jdk.internal.vm.ci/jdk.vm.ci.amd64=ALL-UNNAMED \
--add-exports \
jdk.internal.vm.ci/jdk.vm.ci.meta=ALL-UNNAMED \
--add-exports \
jdk.internal.vm.ci/jdk.vm.ci.hotspot=ALL-UNNAMED \
--add-exports \
jdk.internal.vm.ci/jdk.vm.ci.services=ALL-UNNAMED \
--add-exports \
jdk.internal.vm.ci/jdk.vm.ci.common=ALL-UNNAMED \
--add-exports \
jdk.internal.vm.ci/jdk.vm.ci.code.site=ALL-UNNAMED \
--add-exports \
jdk.internal.vm.ci/jdk.vm.ci.code.stack=ALL-UNNAMED \
--add-opens \
jdk.internal.vm.compiler/org.graalvm.compiler.debug=ALL-UNNAMED \
--add-opens \
jdk.internal.vm.compiler/org.graalvm.compiler.nodes=ALL-UNNAMED \
--add-opens \
jdk.unsupported/sun.reflect=ALL-UNNAMED \
--add-opens \
java.base/jdk.internal.module=ALL-UNNAMED \
--add-opens \
java.base/jdk.internal.ref=ALL-UNNAMED \
--add-opens \
java.base/jdk.internal.reflect=ALL-UNNAMED \
--add-opens \
java.base/java.io=ALL-UNNAMED \
--add-opens \
java.base/java.lang=ALL-UNNAMED \
--add-opens \
java.base/java.lang.reflect=ALL-UNNAMED \
--add-opens \
java.base/java.lang.invoke=ALL-UNNAMED \
--add-opens \
java.base/java.lang.ref=ALL-UNNAMED \
--add-opens \
java.base/java.net=ALL-UNNAMED \
--add-opens \
java.base/java.nio=ALL-UNNAMED \
--add-opens \
java.base/java.nio.file=ALL-UNNAMED \
--add-opens \
java.base/java.security=ALL-UNNAMED \
--add-opens \
java.base/javax.crypto=ALL-UNNAMED \
--add-opens \
java.base/java.util=ALL-UNNAMED \
--add-opens \
java.base/java.util.concurrent.atomic=ALL-UNNAMED \
--add-opens \
java.base/sun.security.x509=ALL-UNNAMED \
--add-opens \
java.base/jdk.internal.logger=ALL-UNNAMED \
--add-opens \
org.graalvm.sdk/org.graalvm.nativeimage.impl=ALL-UNNAMED \
--add-opens \
org.graalvm.sdk/org.graalvm.polyglot=ALL-UNNAMED \
--add-opens \
org.graalvm.truffle/com.oracle.truffle.polyglot=ALL-UNNAMED \
--add-opens \
org.graalvm.truffle/com.oracle.truffle.api.impl=ALL-UNNAMED \
-XX:+UseJVMCINativeLibrary \
-Xss10m \
-Xms1g \
-Xmx13341609160 \
-Duser.country=US \
-Duser.language=en \
-Dorg.graalvm.version=19.3.1 \
-Dorg.graalvm.config=CE \
-Dcom.oracle.graalvm.isaot=true \
--module-path \
/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/truffle/truffle-api.jar \
-javaagent:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/svm.jar \
-Djdk.internal.lambda.disableEagerInitialization=true \
-Djdk.internal.lambda.eagerlyInitialize=false \
-Djava.lang.invoke.InnerClassLambdaMetafactory.initializeLambdas=false \
-cp \
/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/svm.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/graal-llvm.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/javacpp-shadowed.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/svm-llvm.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/llvm-wrapper-shadowed.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/objectfile.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/pointsto.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/llvm-platform-specific-shadowed.jar \
com.oracle.svm.hosted.NativeImageGeneratorRunner$JDK9Plus \
-watchpid \
13917 \
-imagecp \
/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/svm.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/graal-llvm.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/javacpp-shadowed.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/svm-llvm.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/llvm-wrapper-shadowed.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/objectfile.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/pointsto.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/llvm-platform-specific-shadowed.jar:/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/library-support.jar:/data/sys/ssd/svn/sandbox/mapp-graalvmNative/hello-native/src/classes \
-H:Path=/data/sys/ssd/svn/sandbox/mapp-graalvmNative/hello-native/src \
-H:+SharedLibrary \
-H:Name=libhellonative \
-H:Log=InvokeCC: \
-H:CLibraryPath=/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/clibraries/linux-amd64
]
[libhellonative:13938]    classlist:     795.31 ms
[libhellonative:13938]        (cap):     448.67 ms
[libhellonative:13938]        setup:   1,148.39 ms
[libhellonative:13938]   (typeflow):   3,708.11 ms
[libhellonative:13938]    (objects):   3,691.40 ms
[libhellonative:13938]   (features):     165.94 ms
[libhellonative:13938]     analysis:   7,845.74 ms
[libhellonative:13938]     (clinit):      89.50 ms
[libhellonative:13938]     universe:     292.31 ms
[libhellonative:13938]      (parse):     338.44 ms
[libhellonative:13938]     (inline):   1,162.03 ms
[libhellonative:13938]    (compile):   3,353.02 ms
[libhellonative:13938]      compile:   5,273.24 ms
[libhellonative:13938]        image:     551.23 ms
[Use -Dgraal.LogFile=<path> to redirect Graal log output to a file.]
[thread:44] scope: ForkJoinPool-4-worker-19
  [thread:44] scope: ForkJoinPool-4-worker-19.InvokeCC
  Running command: cc -v -o /data/sys/ssd/svn/sandbox/mapp-graalvmNative/hello-native/src/libhellonative.so -z noexecstack -Wl,--gc-sections -Wl,--dynamic-list -Wl,/tmp/SVM-13149438972001240237/exported_symbols.list -Wl,-x -shared -L/tmp/SVM-13149438972001240237 -L/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib -L/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/clibraries/linux-amd64 /tmp/SVM-13149438972001240237/libhellonative.o /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/libnet.a /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/libjava.a /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/libzip.a /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/libnio.a /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/clibraries/linux-amd64/libffi.a /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/clibraries/linux-amd64/libjvm.a /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/clibraries/linux-amd64/libstrictmath.a /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/clibraries/linux-amd64/liblibchelper.a -lm -lpthread -ldl -lz -lrt
  Using built-in specs.
  COLLECT_GCC=cc
  COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
  OFFLOAD_TARGET_NAMES=nvptx-none
  OFFLOAD_TARGET_DEFAULT=1
  Target: x86_64-linux-gnu
  Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.4.0-1ubuntu1~18.04.1' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
  Thread model: posix
  gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 
  COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/
  LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/
  COLLECT_GCC_OPTIONS='-v' '-o' '/data/sys/ssd/svn/sandbox/mapp-graalvmNative/hello-native/src/libhellonative.so' '-z' 'noexecstack' '-shared' '-L/tmp/SVM-13149438972001240237' '-L/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib' '-L/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/clibraries/linux-amd64' '-mtune=generic' '-march=x86-64'
   /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/ccBpfsHi.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -shared -z relro -o /data/sys/ssd/svn/sandbox/mapp-graalvmNative/hello-native/src/libhellonative.so -z noexecstack /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o -L/tmp/SVM-13149438972001240237 -L/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib -L/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/clibraries/linux-amd64 -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. --gc-sections --dynamic-list /tmp/SVM-13149438972001240237/exported_symbols.list -x /tmp/SVM-13149438972001240237/libhellonative.o /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/libnet.a /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/libjava.a /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/libzip.a /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/libnio.a /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/clibraries/linux-amd64/libffi.a /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/clibraries/linux-amd64/libjvm.a /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/clibraries/linux-amd64/libstrictmath.a /data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/clibraries/linux-amd64/liblibchelper.a -lm -lpthread -ldl -lz -lrt -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o
  COLLECT_GCC_OPTIONS='-v' '-o' '/data/sys/ssd/svn/sandbox/mapp-graalvmNative/hello-native/src/libhellonative.so' '-z' 'noexecstack' '-shared' '-L/tmp/SVM-13149438972001240237' '-L/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib' '-L/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/clibraries/linux-amd64' '-mtune=generic' '-march=x86-64'
  
[libhellonative:13938]        write:     103.96 ms
[libhellonative:13938]      [total]:  16,145.05 ms

Code snippet or code repository that reproduces the issue

**https://github.com/oracle/graal/blob/master/substratevm/ImplementingNativeMethodsInJavaWithSVM.md**

Steps to reproduce the issue
Please include both build steps as well as run steps

i am trying to reproduce this hello world example.

when i check the shared library:
nm -a libhellonative.so | grep add
the "add" method does not occure.

and consequently:
java -Djava.library.path=. hello.Run
Exception in thread "main" java.lang.UnsatisfiedLinkError: hello/Run.createIsolate()J
at hello.Run.main(Run.java:28)

Expected behavior

i expect that the generated shared library contains a symbol for the native mthod.
but it does not.

Additional context

Details

i tried both variants, with "///" and without:

package hello;
import org.graalvm.nativeimage.c.function.CEntryPoint;
import org.graalvm.word.Pointer;
public class HelloNative
{
/// @CEntryPoint(name="Java_hello_HelloNative_createIsolate", builtin=CEntryPoint.Builtin.CREATE_ISOLATE)
@CEntryPoint(builtin=CEntryPoint.Builtin.CREATE_ISOLATE)
public static native long createIsolate();
/// @CEntryPoint(name="Java_hello_HelloNative_add")
@CEntryPoint
public static int add(Pointer jniEnv, Pointer clazz, @CEntryPoint.IsolateThreadContext long isolateId, int a, int b)
{ return a + b; }
}


javap -c classes/hello/HelloNative.class
Compiled from "HelloNative.java"
public class hello.HelloNative {
  public hello.HelloNative();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
  public static native long createIsolate();
  public static int add(org.graalvm.word.Pointer, org.graalvm.word.Pointer, long, int, int);
    Code:
       0: iload         4
       2: iload         5
       4: iadd
       5: ireturn
}


 nm -a libhellonative.so | grep add

00000000003115c0 t getInet6Address_ipaddress
00000000003117f0 t getInetAddress_addr
00000000008a3d28 b ia6_ipaddressID
00000000008a3d88 b iac_addressID
000000000031bda0 T Java_sun_nio_fs_UnixNativeDispatcher_readdir
0000000000311be0 T NET_GetPortFromSockaddr
0000000000312d40 T NET_InetAddressToSockaddr
0000000000311a60 T NET_SockaddrEqualsInetAddress
00000000003118b0 T NET_SockaddrToInetAddress
                 U readdir64@@GLIBC_2.2.5
0000000000311640 t setInet6Address_ipaddress
0000000000311710 t setInetAddress_addr
                 U sigaddset@@GLIBC_2.2.5

@uvilop
Copy link
Author

uvilop commented Feb 26, 2020

the problem seems to be that "-cp" is not honoured.
so how can i specify a classpath ?

@olpaw
Copy link
Member

olpaw commented Feb 26, 2020

Looking at the --verbose output I see

-imagecp \
/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/svm.jar:
/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/graal-llvm.jar:
/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/javacpp-shadowed.jar:
/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/svm-llvm.jar:
/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/llvm-wrapper-shadowed.jar:
/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/objectfile.jar:
/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/pointsto.jar:
/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/builder/llvm-platform-specific-shadowed.jar:
/data/sys/aux/opt/java/jdk/graalvm-ce-java11-19.3.1/lib/svm/library-support.jar:
/data/sys/ssd/svn/sandbox/mapp-graalvmNative/hello-native/src/classes \

(added \n for better readability).

Could it be that

/data/sys/ssd/svn/sandbox/mapp-graalvmNative/hello-native/src/classes

is not the classpath entry that holds the classes you want to build an image from in your environment?
What does

> find /data/sys/ssd/svn/sandbox/mapp-graalvmNative/hello-native/src/classes

return?

@olpaw
Copy link
Member

olpaw commented Mar 2, 2020

@uvilop are you still having trouble building shared library native-images?
(Since every GraalVM release contains several shared library native-images, we would know if building shared library native-images wouldn't work. I suspect this is just a usage error.)

@olpaw olpaw added question and removed bug labels Mar 2, 2020
@mardukbp
Copy link

mardukbp commented Mar 10, 2020

The instructions in Implementing Native Methods in Java with Substrate VM are misleading.

In particular, the following statement is false:

First of all one has to use the native-image command to generate a shared library with some JNI-compatible entry points.

First of all one has to compile the Java class to bytecode. Afterwards one executes native-image. Now the generated header and library will reference the Java function using the name assigned with the CEntryPoint decorator.

The example code provided there works as is.

@mardukbp
Copy link

@uvilop Since you have a classes directory, chances are that you are using Maven. In that case you can use the native-image Maven plugin to generate the shared library. See here for details.

@olpaw
Copy link
Member

olpaw commented Mar 11, 2020

@uvilop please reopen are you still having trouble building shared library native-images.

@olpaw olpaw closed this as completed Mar 11, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants