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

Choe, Jiwon jiwon_choe at brown.edu
Tue Apr 21 17:12:05 UTC 2020


Thank you so much for the help!
The build JDK must have been the issue -- I was able to build a native JDK
for the host Linux x86 platform that I am building on, and everything
worked out when I provided that as the build JDK.
(I still had to keep all the configure flags though. The build couldn't
find the correct libraries when I took some of them out...)

On Mon, Apr 20, 2020 at 5:41 PM Erik Joelsson <erik.joelsson at oracle.com>
wrote:

> 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