Hi,

FYI, if one wants to debug this issue, below is some sctripts I used
to cross compile a mips zero jdk, which can trigger the bug.

build machine: x86, debian testing (in a VirtualBox; an ubuntu may
fail to configure)

known worked targets: ppc64le/server and s390x/server (aarch64/server
may fail during make images)

repository: http://hg.openjdk.java.net/jdk/jdk

geting a sysroot:

#export arch=arm64
#export arch=ppc64el
#export arch=s390x
export arch=mips64el
export ver=stretch
apt-get install qemu-user-static sudo debootstrap binfmt-support qemu
(not sure if all of them are required)
sudo qemu-debootstrap --arch=${arch} --verbose \
   
--include=fakeroot,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng-dev,libffi-dev
\
  --resolve-deps ${ver} /chroots/${arch}_${ver}
http://httpredir.debian.org/debian/

configure of jdk:

#arch1=aarch64 ; arch2=arm64; gnuname=gnu
#arch1=powerpc64le ; arch2=ppc64el; gnuname=gnu
#arch1=s390x ; arch2=s390x; gnuname=gnu
arch1=mips64el ; arch2=mips64el; gnuname=gnuabi64
apt install g++-${arch1}-linux-${gnuname} gcc-${arch1}-linux-${gnuname}
ver=stretch
CC=$arch1-linux-${gnuname}-gcc CXX=$arch1-linux-${gnuname}-g++ \
  sh ./configure --openjdk-target=$arch1-linux-${gnuname}
--with-sysroot=/chroots/${arch2}_${ver}/
--with-toolchain-path=/chroots/${arch2}_${ver}/ \
  --with-boot-jdk=/home/loongson/aoqi/jdk-13/ --disable-warnings-as-errors \
  --with-jvm-variants=zero \
  --x-libraries=/chroots/${arch2}_${ver}/usr/lib/$arch1-linux-${gnuname}
--x-include=/chroots/${arch2}_${ver}/usr/include/X11/ \
  --with-freetype-lib=/chroots/${arch2}_${ver}/usr/lib/$arch1-linux-${gnuname}/
--with-freetype-include=/chroots/${arch2}_${ver}/usr/include/freetype2

make:

do one patch [1] then make images

I am trying Magnus's approach. When there are results, I will reply.

[1] 
https://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2018-December/031839.html

On Fri, Jan 25, 2019 at 1:19 AM Erik Joelsson <erik.joels...@oracle.com> wrote:
>
> Hello,
>
> I agree with the conclusion here, there is certainly a bug in the build
> logic. When creating the "Build JDK" during a cross compilation build,
> we are, as Magnus said, cutting a few corners for efficiency. One of
> those corners is assuming all the java classes are the same and can
> simply be reused. It has been shown here that that assumption is not
> always correct.
>
> I think the most reasonable solution is to assume all of java.base needs
> to be built specifically for the "Build JDK". I think this can be
> reasonably easy to implement (compared to the existing Build JDK logic,
> which is arguably rather hairy).
>
> Magnus' suggested workaround should work fine for now however.
>
> Filed https://bugs.openjdk.java.net/browse/JDK-8217739
>
> /Erik
>
> On 2019-01-24 05:30, Magnus Ihse Bursie wrote:
> > On 2019-01-24 13:22, Leslie Zhai wrote:
> >> Hi Magnus,
> >>
> >> Thanks for your kind response!
> >>
> >> 在 2019/1/24 下午8:05, Magnus Ihse Bursie 写道:
> >>>
> >>>
> >>> On 2019-01-24 05:45, David Holmes wrote:
> >>>> On 24/01/2019 1:51 pm, Ao Qi wrote:
> >>>>> Hi David,
> >>>>>
> >>>>> On Thu, Jan 24, 2019 at 10:47 AM David Holmes
> >>>>> <david.hol...@oracle.com> wrote:
> >>>>>>
> >>>>>> Hi Leslie,
> >>>>>>
> >>>>>> I'm not Erik :) however ....
> >>>>>>
> >>>>>> On 24/01/2019 12:28 pm, Leslie Zhai wrote:
> >>>>>>> Hi Erik,
> >>>>>>>
> >>>>>>> Because the flags' macro of MIPS is different from other
> >>>>>>> targets[1], it
> >>>>>>> will effect the `UnixConstants` of
> >>>>>>> src/java.base/unix/classes/sun/nio/fs/UnixConstants.java.template,
> >>>>>>> for
> >>>>>>> example, PREFIX_O_APPEND, so the `Flags` in `FileChannel` is
> >>>>>>> different
> >>>>>>> from other targets.  Then failed[2] to cross compiling jdk12 for
> >>>>>>> mips64el-linux-gnu target by following the document[3].
> >>>>>>
> >>>>>> It's been quite a while since we built for a platform where the
> >>>>>> flags
> >>>>>> had different values, but it is supposed to work. I suspect that
> >>>>>> the way
> >>>>>> we build now with the module system may not be quite correct in this
> >>>>>> regard - but that is just supposition on my part. Because
> >>>>>> compile-time
> >>>>>> constants are stored directly into class files that use them, we
> >>>>>> have to
> >>>>>> generate UnixConstants.java before compiling any class that needs
> >>>>>> to use
> >>>>>> it, then we must compile all classes that do use it. Those
> >>>>>> classes must
> >>>>>> only be executed in conjunction with a tool executing on the target
> >>>>>> platform (javac, jmod etc). My suspicion is that we may be
> >>>>>> executing a
> >>>>>> tool on the build platform using the newly compiled classes for the
> >>>>>> target platform - and that would be wrong.
> >>>>>>
> >>>>>
> >>>>> Yes. Some variables in UnixConstants.java is defined according to the
> >>>>> target (fcntl.h of mips in this case), but would be executed on host
> >>>>> (x86 in this case) during "make images". These variables of ppc64le,
> >>>>> aarch64 and s390x are the same as x86, but the ones of mips are not.
> >>>>> However, mips is not an official supported target and I did not find
> >>>>> other targets have similar issue, I am not sure if this is a bug
> >>>>> or if
> >>>>> this is the right mailing list :)
> >>>>
> >>>> This is the right mailing list to discuss. :)
> >>>>
> >>>> So I went back to find when this happened in the past and I
> >>>> mis-remembered how we solved it. We previously had a problem with
> >>>> the Oracle Java SE Embedded PPC port where some Linux PPC-e500v2
> >>>> platforms defined a different value for the O_NOFOLLOW and O_DIRECT
> >>>> flags. The solution then was to commit a platform specific version
> >>>> of UnixConstants.java and change the build system to only use the
> >>>> template file if there was not a pre-existing .java file. But that
> >>>> platform and the SE Embedded support was all removed.
> >>>> (SocketOptions.java had a similar problem.) Further that build
> >>>> logic is completely different to what we had back then (JDK 6/7).
> >>>>
> >>>> This is definitely a bug in our build logic IMHO as we specifically
> >>>> use the build platform c-pre-processor to process the template file
> >>>> based on the target header files, but then use the resulting class
> >>>> when running tools on the build platform.
> >>> I agree with David. This is a bug in the build system; arguably even
> >>> a regression.
> >>>
> >>>> This was not something that happened in 6/7 or even 8 and I think
> >>>> the module system tools are where the issue now lies.
> >>>>
> >>>> I think Erik and/or Magnus will have to give advice on how this may
> >>>> be properly fixed. I can't see any simple solution.
> >>> Unfortunately, I also agree that there is no simple solution. :-(
> >>>
> >>> The proper way to handle this is to generate two versions of
> >>> UnixConstants and friends, one for the build platform, and one for
> >>> the target platform. But as far as I know, there is no simple way to
> >>> handle such complications in our current structure. Erik knows more
> >>> about this, he was the one who designed the current solution for
> >>> handling cross-compilation in the modularized world.
> >>>
> >>> However, I can at least help you with a relatively simple
> >>> workaround. First some background: When we cross-compile, we need
> >>> not only a Boot JDK (of version current N-1) running on the build
> >>> host platform, but we also need a Build JDK, based on the current
> >>> source code, running on the build host. (This is for running
> >>> jmod/jlink; it needs to be up to date). If we have no Build JDK
> >>> present, we start by creating one ourselves. This is more or less
> >>> the same output as running a normal, non-cross compiled, build on
> >>> the build host. (But Erik found some ways to cut a few corners to
> >>> save time.) Your problem is that the Build JDK is broken, since
> >>> UnixConstants has the wrong values.
> >>> -
> >>> But you can supply your own working Build JDK to configure!
> >>>
> >>> So, your workflow for cross-compiling to MIPS should be:
> >>> 1) create a Build JDK, e.g. like this: "bash configure
> >>> --with-conf-name=buildjdk && make jdk CONF=buildjdk"
> >>> 2) create your cross-compilation JDK like this: "bash configure
> >>> --openjdk-target=mipsel-unknown-linux-gnu
> >>> --with-build-jdk=build/buildjdk/jdk"
> >>> ... or something like that.
> >>> Then you can build your cross-compiled jdk with "make images
> >>> CONF=mips".
> >>
> >> I will try that, thanks a lot for your teaching!
> > Please let me know if it works. I wrote the command lines out of my
> > head, so they might need some tweaking to get right.
> >
> > Perhaps this is an acceptable solution to you? Unless Erik can suggest
> > ways to fix this properly that is not too complicated, maybe this can
> > be a good enough solution for you? (But if there is a simple solution,
> > I'd rather have it fixed properly.)
> >
> > /Magnus
> >>
> >> Regards,
> >>
> >> Leslie Zhai
> >>
> >>
> >>>
> >>>
> >>> In theory, you should rebuild your buildjdk for each and every
> >>> change ("make jdk CONF=buildjdk && make images CONF=mips"); but in
> >>> reality, I don't believe there is really any need to rebuild the
> >>> buildjdk (unless major changes in jlink/jmod happens).
> >>>
> >>> /Magnus
> >>>>
> >>>> David
> >>>> -----
> >>>>
> >>>>>   For example:
> >>>>>
> >>>>> jdk/build$ find . -name UnixConstants.java | xargs grep -A2 O_APPEND
> >>>>> ./linux-ppc64le-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java:
> >>>>>
> >>>>>     static final int O_APPEND =
> >>>>> ./linux-ppc64le-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>
> >>>>> ./linux-ppc64le-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>
> >>>>>                                       02000
> >>>>> --
> >>>>> ./linux-x86_64-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java:
> >>>>>
> >>>>>     static final int O_APPEND =
> >>>>> ./linux-x86_64-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>
> >>>>> ./linux-x86_64-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>
> >>>>>                                       02000
> >>>>> --
> >>>>> ./linux-s390x-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java:
> >>>>>
> >>>>>     static final int O_APPEND =
> >>>>> ./linux-s390x-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>
> >>>>> ./linux-s390x-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>
> >>>>>                                       02000
> >>>>> --
> >>>>> ./linux-aarch64-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java:
> >>>>>
> >>>>>     static final int O_APPEND =
> >>>>> ./linux-aarch64-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>
> >>>>> ./linux-aarch64-server-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>
> >>>>>                                       02000
> >>>>> --
> >>>>> ./linux-x86_64-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java:
> >>>>>
> >>>>>     static final int O_APPEND =
> >>>>> ./linux-x86_64-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>
> >>>>> ./linux-x86_64-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>
> >>>>>                                       02000
> >>>>> --
> >>>>> ./linux-mips64el-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java:
> >>>>>
> >>>>>     static final int O_APPEND =
> >>>>> ./linux-mips64el-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>
> >>>>> ./linux-mips64el-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>
> >>>>>                                       0x0008
> >>>>> --
> >>>>> ./linux-ppc64le-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java:
> >>>>>
> >>>>>     static final int O_APPEND =
> >>>>> ./linux-ppc64le-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>
> >>>>> ./linux-ppc64le-zero-release/support/gensrc/java.base/sun/nio/fs/UnixConstants.java-
> >>>>>
> >>>>>                                       02000
> >>>>>
> >>>>> log.mips:2of path:
> >>>>> /home/loongson/aoqi/jdk-mips/build/linux-mips64el-normal-server-release/support/interim-jmods/temp/.java.base.jmod.tmp
> >>>>>
> >>>>> oflags: 769 O_TRUNC:512 O_APPEND:8 O_CREAT:256 O_EXCL:1024
> >>>>> log.ppc:2of path:
> >>>>> /home/loongson/aoqi/jdk-mips/build/linux-ppc64le-normal-server-release/support/interim-jmods/temp/.java.base.jmod.tmp
> >>>>>
> >>>>> oflags: 577 O_TRUNC:512 O_APPEND:1024 O_CREAT:64 O_EXCL:128
> >>>>>
> >>>>> Cheers,
> >>>>> Ao Qi
> >>>>>
> >>>
> >>
> >

Reply via email to