cross-compile JDK 14 with arm-linux-gnueabihf target

Erik Joelsson erik.joelsson at oracle.com
Mon Apr 20 21:41:14 UTC 2020


Hello Jiwon,

Are you able to build a native JDK for the x86 platform you are running 
the build on or is that giving the same errors?

Since JDK 9, when cross compiling, we need a native JDK to run some of 
the build steps with (jmod and jlink mainly). This native JDK (referred 
to as the "build" jdk in configure and the makefiles) has to match the 
version you are cross compiling exactly. If one is not provided, the 
default is to build one on the fly using the sources present, but we 
only compile the modules necessary to run the build steps.

A way to work around this is to explicitly build a native JDK from the 
same sources first, and then provide that image to the cross compilation 
build using --with-build-jdk=... That may help you here, not sure. It 
may at least be easier to troubleshoot the native build if done 
explicitly. Especially if you need to disable warnings in that build as 
well.

I don't think you need all of those configure arguments. Configure 
should find the correct compiler for your target if present on your 
path. The sysroot setting should get you the correct system include 
paths etc. If freetype is installed in your sysroot in a reasonable 
location, it should be found automatically. Disabling warnings should be 
done using --disable-warnings-as-errors. Linking stdc++ static should be 
done with --with-stdc++lib=<static>,<dynamic>,<default>.

/Erik

On 2020-04-20 14:04, Choe, Jiwon wrote:
> Hello all,
>
> I'm trying to cross-compile OpenJDK 14 to target arm-linux-gnueabihf, and
> the build is failing for me with these errors:
>
> === Output from failing command(s) repeated here ===
> * For target buildjdk_hotspot_variant-server_libjvm_objs_os_linux_x86.o:
> /home/sim32/jdk14/jdk14/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp: In
> static member function 'static u_char* os::Linux::ucontext_get_pc(const
> ucontext_t*)':
> /home/sim32/jdk14/jdk14/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp:120:35:
> error: 'const mcontext_t' has no member named 'gregs'
>     return (address)uc->uc_mcontext.gregs[REG_PC];
>                                     ^
> /home/sim32/jdk14/jdk14/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp:90:16:
> error: 'REG_EIP' was not declared in this scope
>   #define REG_PC REG_EIP
>                  ^
> /home/sim32/jdk14/jdk14/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp:120:41:
> note: in expansion of macro 'REG_PC'
>     return (address)uc->uc_mcontext.gregs[REG_PC];
>                                           ^
> /home/sim32/jdk14/jdk14/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp: In
> static member function 'static void os::Linux::ucontext_set_pc(ucontext_t*,
> address)':
> /home/sim32/jdk14/jdk14/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp:124:19:
> error: 'mcontext_t' has no member named 'gregs'
>     uc->uc_mcontext.gregs[REG_PC] = (intptr_t)pc;
>                     ^
> /home/sim32/jdk14/jdk14/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp:90:16:
> error: 'REG_EIP' was not declared in this scope
>     ... (rest of output omitted)
>
>
> Although my build system is 32-bit x86 Linux, I'm confused because it seems
> odd that a cross-compile for ARM would need to compile something in a
> linux_x86 directory.
>
>
> These are the steps I took for the build:
>
> 1.  sudo qemu-debootstrap --arch=armhf --verbose
> --include=fakeroot,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libfreetype6-dev,libasound2-dev,libc6-dev,gcc-multilib,g++-multilib
> --resolve-deps trusty /opt/sysroot/
>
> 2.  bash configure --openjdk-target=arm-linux-gnueabihf
> --with-sysroot=/opt/sysroot/
> --with-freetype-include=/opt/sysroot/usr/include/freetype2
> --with-freetype-lib=/opt/sysroot/usr/lib/arm-linux-gnueabihf
> --with-extra-cflags='-Wno-error
> -I/opt/sysroot/usr/include/arm-linux-gnueabihf/c++/4.8
> -I/opt/sysroot/usr/include/c++/4.8' --with-extra-cxxflags='-Wno-error
> -I/opt/sysroot/usr/include/arm-linux-gnueabihf/c++/4.8
> -I/opt/sysroot/usr/include/c++/4.8' --with-stdc++lib=static
> CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++
>
> 3.  make images
>
>
> The steps above worked for me when I tried the same cross-compile for JDK
> 8. I had an additional flag --with-jvm-variants=client in the configure
> stage for JDK 8. I tried both client and server variants for JDK 14, and I
> get the same error.
>
> If anyone has insight into how to fix or work around this issue, please let
> me know!
>
> Thanks in advance,
> Jiwon Choe



More information about the build-dev mailing list