在Ubuntu 18.04下编译OpenJDK 11
在Ubuntu 18.04下编译OpenJDK 11
源码下载地址:
链接: https://pan.baidu.com/s/1QAdu-B6n9KqeBakGlpBS3Q 密码: 8lho
Linux下的环境要求
不同版本的jdk会要求在不同版本的Ubuntu下编译,不要用太高版本的Ubuntu或者gcc,特别是gcc,这个跟glibc的版本还绑定,如果gcc版本太高,则glibc版本也高,也会影响openjdk的编译。
gcc7,freetype2
可以直接使用apt-get install安装
编译OpenJDK11
先configure,再make
configure可以参考openjdk/doc/building.html
安装必要的库
sudo apt-get install build-essential
由于jdk的编译需要一个boot-jdk,即自举用的jdk。因此,需提前安装一个openjdk11。
sudo apt install openjdk-11-jdk -y
安装完毕之后查看version
jx@ubuntu:~$ which java
/usr/bin/java
jx@ubuntu:~$ java --version
openjdk 11.0.19 2023-04-18
OpenJDK Runtime Environment (build 11.0.19+7-post-Ubuntu-0ubuntu118.04.1)
OpenJDK 64-Bit Server VM (build 11.0.19+7-post-Ubuntu-0ubuntu118.04.1, mixed mode, sharing)
此时发现默认安装的jdk是11.0.19。由于自举jdk只能是N或者N-1版本,因此,我们选择一个比当前安装jdk稍微大一点的版本进行编译以保证成功。
git checkout -b jdk-11+19 jdk-11+19
我的configure按照以下命令
bash configure --with-debug-level=slowdebug --disable-warnings-as-errors
如果不能产生调试信息
bash configure --with-native-debug-symbols=internal --with-debug-level=slowdebug --with-jvm-variants=server --with-jvm-features=minimal --disable-warnings-as-errors
make
make CONF=macosx-x86_64-server-slowdebug
不要怀疑源码的Makefile有问题,当报错时,可能是gcc版本太高了,建议使用7或8。
交叉编译AArch64
-
首先在x86上安装openjdk11
-
安装必要的工具和依赖项
sudo apt-get install autoconf libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev libasound2-dev libfontconfig1-dev
- 安装gcc
sudo apt install gcc-7 g++-7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 --slave /usr/bin/g++ g++ /usr/bin/g++-7 --slave /usr/bin/gcov gcov /usr/bin/gcov-7
- 安装aarch64的交叉工具链
sudo apt install gcc-7-aarch64-linux-gnu g++-7-aarch64-linux-gnu
- 安装x11
sudo apt install x11proto-core-dev x11proto-input-dev x11proto-kb-dev x11proto-render-dev x11proto-xext-dev libxi-dev
然而,这样安装并不能把x11
放在交叉工具链的目录中,需要进行如下操作
cd /usr/aarch64-linux-gnu
sudo ln -sf /usr/include/X11 ./X11
sudo cp /usr/lib/x86_64-linux-gnu/libX11.so* /usr/aarch64-linux-gnu/lib/
sudo cp /usr/lib/x86_64-linux-gnu/libXext.so* /usr/aarch64-linux-gnu/lib/
sudo cp /usr/lib/x86_64-linux-gnu/libXrender.so* /usr/aarch64-linux-gnu/lib/
sudo cp /usr/lib/x86_64-linux-gnu/libXtst.so* /usr/aarch64-linux-gnu/lib/
sudo cp /usr/lib/x86_64-linux-gnu/libXt.so* /usr/aarch64-linux-gnu/lib/
然而,上述的方法安装的是x86_64
架构下的libX
,此时需要将获得libX11
的aarch64
版本:
- 方法1:
[如何交叉编译X11](ubuntu使用arrch64 arm进行交叉编译 X11_x11extra 交叉编译-CSDN博客)
- 方法2:(我采用的是这个方法)
拷贝一台aarch64
机器上的libX
库到/usr/aarch64-linux-gnu/lib/
里。
其中,ARM
机器的库位置在/usr/lib/aarch64-linux-gnu
注意,拷贝这些.so文件不包括libX11.so,这个文件是一个软连接文件。如果报错误表示libX11.so不兼容,则建立与libX11.so.6.3.0的软链接。其他类似的文件也是如此。如果不知道软链接的具体关联位置,请查找x86
机器中/usr/lib/x86_64-linux-gnu
里面的关系。
ln -sf /usr/aarch64-linux-gnu/lib/libX11.so.6.3.0 /usr/aarch64-linux-gnu/lib/libX11.so
- 安装freetype
如果上述网址无法下载,则通过浏览器的搜索找到对应的deb包,下载后通过dpkg进行安装。安装时提示已经存在x86的版本,此时采用如下方式
sudo dpkg -i --instdir=/home/jx/libs/freetype libfreetype6_2.10.4+dfsg-1+deb11u1_arm64.deb
其中/home/jx/libs/freetype
为自定义目录,安装完成后,其.so
文件会在/home/jx/libs/freetype/usr/lib/aarch64-linux-gnu
中。将其中的.so
文件拷贝到/usr/aarch64-linux-gnu/lib
中。
若提示
ld: cannot find -lfreetype
则还是软链接的问题,新建一个libfreetype.so的软链接,链接到libfreetype.so.6.17.4
- 安装libasound
提示
ld: cannot find -lasound
表示没有aarch64架构下的libasound库,其操作如上述库的安装。注意最后使用libasound.so的软链接。
然后在openjdk源码目录下创建一个config.sh
文件
#!/bin/bash
bash ./configure \--openjdk-target=aarch64-linux-gnu \--with-tools-dir=/usr/bin \--with-debug-level=release \--disable-warnings-as-errors \--x-includes=/usr/aarch64-linux-gnu/include \--x-libraries=/usr/aarch64-linux-gnu/lib \CC=aarch64-linux-gnu-gcc-7 \CXX=aarch64-linux-gnu-g++-7
运行
bash config.sh
执行
make CONF=linux-aarch64-normal-server-release images