环境说明
| 项 | 值 |
|---|---|
| jdk版本 | jdk8,因官网推荐的hg下载速度非常不友好, 使用以下地址,另外用github镜像传送门 |
| boot-jdk | jdk7u70 |
| os | ubuntu 18.04 |
| make | 4.1 |
前置安装
gcc安装
openjdk官网build教程中,有如下说明
The minimum accepted version of gcc is 5.0. Older versions will generate a warning by configure and are unlikely to work.
The JDK is currently known to be able to compile with at least version 11.2 of gcc.
In general, any version between these two should be usable.
gcc的安装方法也可查看其官方教程
-
先将ubuntu内置的gcc移除
sudo apt remove gcc -
下载gcc
找一个国内的镜像仓库,找到对应的版本gcc压缩包下载,本文下载的是9.5.0版本
cd /usr/loca/share wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.gz -
解压
tar -zxvf gcc-9.5.0.tar.gz cd gcc-9.5.0 -
下载依赖库
./contrib/download_prerequisites # zlib apt install zlib1g-dev -
configure
./configure --prefix=/usr/local/share/gcc-9.5.0/build --enable-threads=posix --disable-checking --enable--long-long --with-system-zlib --enable-language=c,c++ --disable-multilib命令相关参数可查看官网教程对configure的说明
-
make
make make install -
命令更新
#删除内置命令 rm -rf /usr/bin/gcc /usr/local/bin/gcc /usr/bin/g++ /usr/local/bin/g++ #建立新的软链 ln -s /usr/local/share/gcc-9.5.0/build/bin/gcc /usr/bin/gcc ln -s /usr/local/share/gcc-9.5.0/build/bin/gcc /usr/local/bin/gcc ln -s /usr/local/share/gcc-9.5.0/build/bin/g++ /usr/bin/g++ ln -s /usr/local/share/gcc-9.5.0/build/bin/g++ /usr/local/bin/g++ -
test
验证是否安装成功,返回具体版本信息即可
gcc -v
gdb安装
-
先将ubuntu内置的gdb移除
apt remove gdb # texinfo依赖 apt install texinfo -
下载gcc
找一个国内的镜像仓库,找到对应的版本gdb压缩包下载,本文下载的是9.2版本
cd /usr/loca/share wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gdb/gdb-9.2.tar.gz -
解压
tar -zxvf gdb-9.2.tar.gz cd gdb-9.2 -
新建目录并执行configure gdb安装要求不能在源码目录,这个没搞懂
mkdir -p /usr/local/share/gdb/build cd /usr/local/share/gdb build /usr/local/share/gdb-9.2/configure --prefix=/usr/local/share/gdb/build -
make
make make install -
命令更新
rm -rf /usr/bin/gdb /usr/local/bin/gdb ln -s /usr/local/share/gdb/build/bin/gdb /usr/bin/gdb ln -s /usr/local/share/gdb/build/bin/gdb /usr/local/bin/gdb -
test
验证是否安装成功,返回具体版本信息即可
gdb -v
boot-jdk安装
下载jdk7,官网下载linux版本即可,不需要进行相关配置,假如放的位置如下:
/usr/local/share/jdk7
jdk编译前置库安装
- FreeType
apt install libfreetype6-dev - CUPS
apt install libcups2-dev - X11
apt install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev - ALSA
apt install libasound2-dev - libffi
apt install libffi-dev - Autoconf
apt install autoconf
源码编译
-
目录创建
mkdir -p /data/code #授权 chown -R qinghua:qinghua /data/code #切到qinghua用户 su qinghua -
源码下载
源码在git仓库中,需要用到git命令
#没有git的话,执行以下安装命令 sudo apt install git #此处使用github镜像仓库下载 git clone https://hub.nuaa.cf/AdoptOpenJDK/openjdk-jdk8u.git -
configure
cd openjdk-jdk8u #给予可执行权限 chmod u+x configure ./configure --with-boot-jdk=/usr/local/share/jdk7 -
make
make all可能会存在着如下报错
os_linux.cpp 4999:15 "%s" argument require is null编译os_linux.cpp文件,改成如下:
if(exception_name(sig, buf, 0_BUFLEN) != NULL) { tty->print("Warning: %s handler", exception_name(sig, buf, 0_BUFLEN)); }更改后,再执行
make all -
验证是否成功
# 进入build目录 cd ./build/linux-x86_64-normal-server-release/jdk/bin ./java -version
调试
使用vscode来调试
launch.json文件如下:
{
"configurations": [
{
//debug name
"name": "hotspot linux debug",
"type": "cppdbg",
"request": "launch",
//待测试的程序,即编译成功的java命令
"program": "/data/code/jdk8u/build/linux-x86_64-normal-server-release/jdk/bin/java",
"args": [
//java class文件名
//Hello.class必须在下面的指定的environment中的CLASSPATH目录下
"Hello"
],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [
{"name":"JAVA_HOME","value":"/data/code/jdk8u/build/linux-x86_64-normal-server-release/jdk"},
{"name":"CLASSPATH","value":".:/data/code/java"}
],
"externalConsole": false,
"MIMode": "gdb"
}
],
"version": "2.0.0"
}
点击 run and debug 按钮,点击对应的debug配置开始debug。
总结
- 对于前置库、软件等程序安装,我们直接以root用户来安装,对于jdk的编译调试,我们使用普通用户即可
- 调试时,为能进行更详细的debug,在编译jdk时,可做如下指定
./configure --with-boot-jdk=/usr/local/share/jdk7 --with-debug-level=slowdebug with-jvm-variants=server
注:之前在22.04版本的ubuntu安装过一次,但是一直无法调试,一直报一个什么"interpreter-exec console ... set env ..."的错误,没解决,放弃并换用18.04版本,成功编译并调试。