RISC-V GNU toolchain debug for OpenJDK 8 on riscv64 environment
示例于 Ubuntu 22.04 LTS 上. 对于中国大陆的小伙伴来说,所有的 github.com 可以用 kgithub.com 代替.
Step 0: 预备
sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \
                 gawk build-essential bison flex texinfo gperf libtool patchutils bc \
                 zlib1g-dev libexpat-dev git \
                 libglib2.0-dev libfdt-dev libpixman-1-dev \
                 libncurses5-dev libncursesw5-dev ninja-build \
                 python3 autopoint pkg-config zip unzip screen \
                 make libxext-dev libxrender-dev libxtst-dev \
                 libxt-dev libcups2-dev libfreetype6-dev \
                 mercurial libasound2-dev cmake libfontconfig1-dev
Step 1: Toolchain 的编译准备
git clone https://github.com/riscv/riscv-gnu-toolchain
cd riscv-gnu-toolchain
git submodule update --init --recursive
Step 2: 编译 ToolChain
在这一步的时候因为源码都是从海外站点获取,中国大陆的小伙伴可能连接不上.此时我们善用镜像,编辑 .gitmodules 这个文件:
[submodule "binutils"]
        path = binutils
        url = https://gitee.com/mirrors/binutils-gdb.git
        branch = binutils-2_39-branch
[submodule "gcc"]
        path = gcc
        url = https://gitee.com/mirrors/gcc.git
        branch = releases/gcc-12
[submodule "glibc"]
        path = glibc
        url = https://kgithub.com/bminor/glibc.git
[submodule "dejagnu"]
        path = dejagnu
        url = https://kgithub.com/MIPS/dejagnu.git
        branch = dejagnu-1.6.3
[submodule "newlib"]
        path = newlib
        url = https://gitee.com/mirrors/newlib-cygwin.git
        branch = master
[submodule "gdb"]
        path = gdb
        url = https://gitee.com/mirrors/binutils-gdb.git
        branch = gdb-12-branch
[submodule "qemu"]
        path = qemu
        url = https://gitee.com/mirrors/qemu.git
[submodule "musl"]
        path = musl
        url = https://gitee.com/mirrors/musl.git
        branch = master
[submodule "spike"]
        path = spike
        url = https://github.com/riscv-software-src/riscv-isa-sim.git
        branch = master
[submodule "pk"]
        path = pk
        url = https://github.com/riscv-software-src/riscv-pk.git
        branch = master
然后再用 git submodule sync --recursive 这个命令同步一下即可.
mkdir ../riscv64
./configure --prefix=/home/ubuntu/riscv64
make linux -j
注意,如果是编译 jdk8 的话,可能需要较老版本的 glibc,先回退再编译: git checkout glibc-2.34
编译成功后写入你的环境变量:
export PATH="/home/ubuntu/riscv64/bin:$PATH"
Step 3: 编译 QEMU
Ubuntu 22.04 已经内置 QEMU 7,可不需要这一步.
cd ~
git clone https://github.com/qemu/qemu.git
cd qemu
./configure \
  --static \
  --enable-attr \
  --enable-tcg \
  --enable-linux-user \
  --target-list=riscv64-linux-user \
  --without-default-devices \
  --without-default-features \
  --disable-install-blobs \
  --disable-debug-info \
  --disable-debug-tcg \
  --disable-debug-mutex
make -j$(nproc)
sudo make install
Step 4: 编译额外库
我们需要安装一些额外库的 RISC-V 版本.
#!/bin/bash
mkdir build_ext_libs_riscv64 && cd build_ext_libs_riscv64
git clone --depth=1 https://github.com/libffi/libffi
git clone --depth=1 https://github.com/apple/cups
git clone --depth=1 https://github.com/libexpat/libexpat
git clone --depth=1 https://github.com/madler/zlib
git clone --depth=1 https://github.com/glennrp/libpng
wget https://download.savannah.gnu.org/releases/freetype/freetype-2.10.4.tar.gz && tar -xzvf freetype-2.10.4.tar.gz && mv freetype-2.10.4 freetype2 && rm -f freetype-2.10.4.tar.gz
git clone -b json-c-0.13 --depth=1 https://github.com/json-c/json-c
git clone --depth=1 https://gitlab.freedesktop.org/fontconfig/fontconfig
git clone --depth=1 https://github.com/alsa-project/alsa-lib
git clone --depth=1 https://github.com/karelzak/util-linux
mkdir xorg && cd xorg && wget https://gist.githubusercontent.com/misaka00251/a8990410d9e0fb565aa7cf7992d178d1/raw/749dfce2dfc1f116c8ebec536dcc7bfe4a1011b7/xorg_modules && git clone --depth=1 https://github.com/misaka00251/xorg-util-modular.git util/modular
cd ..
然后,在刚刚创建的 build_ext_libs_risv64 里面保存如下脚本
#!/bin/bash
# exit on error
set -e
if [ ! -n "$1" ];then
    echo "Please designate riscv toolchain path"
    exit 1
else
    riscvpath=$1
    echo "riscv toolchian path was set as: $riscvpath"
fi
export PATH=$riscvpath/bin:$PATH
export sysroot=$riscvpath/sysroot
export prefix=$sysroot/usr
# libffi
cd libffi && ./autogen.sh && ./configure --host=riscv64-unknown-linux-gnu --prefix=$prefix 
make && make install
cd -
# cups
cd cups && ./configure --host=riscv64-unknown-linux-gnu --disable-ssl --disable-gssapi --disable-avahi --disable-libusb --disable-dbus --disable-systemd
make CFLAGS="-Wno-error=sign-conversion -Wno-error=format-truncation" CXXFLAGS="-Wno-error=sign-conversion -Wno-error=format-truncation" && make install DSTROOT=$sysroot
cd -
# libexpat
cd libexpat/expat && ./buildconf.sh &&./configure --host=riscv64-unknown-linux-gnu --prefix=$prefix
make && make install
cd -
# zlib
cd zlib && CHOST=riscv64 CC=riscv64-unknown-linux-gnu-gcc AR=riscv64-unknown-linux-gnu-ar RANLIB=riscv64-unknown-linux-gnu-ranlib ./configure  --prefix=$prefix
make && make install
cd -
# libpng
cd libpng && ./configure --host=riscv64-unknown-linux-gnu --prefix=$prefix
make && make install
cd -
# freetype2
cd freetype2 && ./autogen.sh && ./configure --host=riscv64-unknown-linux-gnu --prefix=$prefix --with-brotli=no --with-harfbuzz=no --with-bzip2=no
make && make install
cd -
# json-c
cd json-c && ./autogen.sh &&  ./configure --host=riscv64-unknown-linux-gnu --prefix=$prefix
make && make install
cd -
# fontconfig
cd fontconfig && PKG_CONFIG_PATH=$prefix/lib/pkgconfig ./autogen.sh --host=riscv64-unknown-linux-gnu --prefix=$prefix
make && make install
cd -
# alsa-lib
cd alsa-lib && libtoolize --force --copy --automake && aclocal && autoheader && automake --foreign --copy --add-missing && autoconf && ./configure --host=riscv64-unknown-linux-gnu --prefix=$prefix
make && make install
cd -
# util-linux
cd util-linux && ./autogen.sh && ./configure --host=riscv64-unknown-linux-gnu --prefix=$prefix --disable-all-programs --enable-libuuid
make && make install || true
cd -
# xorg
cd xorg && CONFFLAGS="--host=riscv64-unknown-linux-gnu --disable-malloc0returnsnull" ./util/modular/build.sh --modfile ./xorg_modules --clone $prefix
echo "Success. exit"
执行的时候要输入工具链的完整路径:
sh build.sh /home/ubuntu/riscv64
如果喜欢本文,欢迎点击下方的「鼓掌」按钮!
如果上面没有加载出任何东西,可以点击这里。