完善libc,构建了OS-specific工具链,编译了基于gcc-11.3.0的DragonOS userland compiler,移植了mpfr,gmp,mpc库 (#134)

* 修改include路径

* 添加了创建libsysapi.a和/bin/sysroot/usr/include/+lib/的代码

* 修补.gitignore

* 删除多余项

* 优化脚本可读性

* 新增crt0 crti crtn

* 编译binutils所需的东西

* fflush()和fprintf()的简单实现

* 应用程序启动前,调用初始化libc的函数

* 自动创建sysroot

* 添加了stderr的初始化

* 修改了stderr的初始化

* 内核添加对stdio的简略处理

* 格式化代码

* 修正打开stdio文件描述符的问题

* bugfix: 修复fprintf忘记释放buf的问题

* 修复shell错误地把入口设置为main而不是_start的问题

* 新增__cxa_atexit  (gcc要求libc提供这个)

* 增加putchar puts

* 更新写入磁盘镜像的脚本,默认无参数时,使用legacy方式安装

* 更新编译脚本

* stdio增加eof的定义

* 新增extern cplusplus

* mpfr gmp mpc 构建脚本

* 更新libsysapi.a为libc.a

* 加上ferror fopen fclose

* 更新移植的软件的构建脚本

* 更改build_gcc_toolchain.sh中的-save参数名为-save-cache

Co-authored-by: longjin <longjin@RinGoTek.cn>
This commit is contained in:
guanjinquan
2023-01-06 21:29:23 +08:00
committed by GitHub
parent 61de2cdc3f
commit 2224c93ea9
49 changed files with 746 additions and 70 deletions

15
user/port/README.md Normal file
View File

@ -0,0 +1,15 @@
# port目录
---
本目录移植到DragonOS的应用程序。
可以包含以下类型的文件:
- 移植的patch以及编译脚本、编译用的Dockerfile等
- 把子目录作为git仓库的submodule
## 注意
编译好libc之后要把sysroot/usr/lib的文件复制到$HOME/opt/dragonos-host-userspace/x86_64-dragonos/lib. 因为ld会从这里面找链接的东西。
目前由于DragonOS的libc还不完善所以尚未能使用用户态交叉编译器来编译flex。

1
user/port/binutils/2.38/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
build-binutils/

View File

@ -0,0 +1,41 @@
# 本Dockerfile用于构建binutils 2.38的交叉编译环境
FROM ubuntu:jammy
# Install dependencies
RUN apt-get update && apt-get install -y \
autoconf2.69 \
automake \
bison \
build-essential \
flex \
gawk \
gettext \
git \
libgmp-dev \
libmpc-dev \
libmpfr-dev \
libncurses5-dev \
libtool \
m4 \
make \
ninja-build \
python3 \
texinfo \
wget \
xz-utils \
zlib1g-dev \
wget \
&& rm /usr/bin/autoconf && ln -s /usr/bin/autoconf2.69 /usr/bin/autoconf
WORKDIR /opt
# download automake 1.15.1
RUN wget http://mirrors.ustc.edu.cn/gnu/automake/automake-1.15.1.tar.xz && \
tar -xvf automake-1.15.1.tar.xz && \
cd automake-1.15.1 && \
./configure --prefix=/usr && \
make && \
make install && \
cd .. && \
rm -rf automake-1.15.1 automake-1.15.1.tar.xz

View File

@ -0,0 +1,25 @@
# binutils-2.38
## 说明
这里是移植到用户态的binutils-2.38用于DragonOS的用户态编译器。在编译这里之前请先在项目根目录下运行`make -j $(nproc)`, 以确保编译binutils所依赖的依赖库已经编译好。
先修改build.sh中的路径配置好需要的信息再使用以下命令即可开始编译
```bash
bash build.sh
```
---
请注意如果您要修改binutils的代码请先使用以下命令构建编辑binutils代码配置的环境
```bash
docker build --no-cache -t dragonos-binutils-build .
```
然后再在binutils目录下执行以下命令进入容器
```bash
docker run --rm -it -v $PWD:/workdir -w /workdir dragonos-binutils-build
```

View File

@ -0,0 +1,42 @@
# 编译前请先设置参数
sys_root=$DRAGONOS_SYSROOT
binutils_path=请填写binutils的路径
# 要安装到的目录
PREFIX=$HOME/opt/dragonos-host-userspace
if [ ! -d ${binutils_path} ]; then
echo "Error: ${binutils_path} not found"
exit 1
fi
if [ ! -d ${sysroot} ]; then
echo "Error: ${sysroot} not found"
exit 1
fi
mkdir -p build-binutils || exit 1
mkdir -p ${PREFIX} || exit 1
# 安装依赖
# 注意texinfo和binutils的版本是否匹配
# 注意gmp/mpc/mpfr和gcc/g++的版本是否匹配
sudo apt-get install -y \
g++ \
gcc \
make \
texinfo \
libgmp3-dev \
libmpc-dev \
libmpfr-dev \
flex \
wget
cd build-binutils
${binutils_path}/configure --prefix=${PREFIX} --target=x86_64-dragonos --with-sysroot=${sysroot} --disable-werror || exit 1
make -j $(nproc) || exit 1
make install || exit 1
make clean || exit 1
rm -rf build-binutils

View File

@ -0,0 +1 @@
docker run --rm -it -v $PWD:/workdir -w /workdir binutils-2.38

17
user/port/build.sh Normal file
View File

@ -0,0 +1,17 @@
source pkg-config.sh
path=(
gmp/6.2.1
mpfr/4.1.1
mpc/1.2.1
flex/2.6.4
)
current_path=$(pwd)
for i in ${path[@]}; do
echo "Building $i"
cd $i
./build.sh || exit 1
cd $current_path
done
cd $current_path

1
user/port/flex/2.6.4/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
build/

View File

@ -0,0 +1,37 @@
# 编译前请先设置参数
sys_root=$DRAGONOS_SYSROOT
src_path=请填写flex的路径
current_path=$(pwd)
# 要安装到的目录
PREFIX=/usr
if [ ! -d ${src_path} ]; then
echo "Error: ${src_path} not found"
exit 1
fi
if [ ! -d ${sysroot} ]; then
echo "Error: ${sysroot} not found"
exit 1
fi
cd ${src_path}
autoreconf --install
autoconf
sed -i 's/ios[*]/ios* | dragonos* /' build-aux/config.sub
cd ${current_path}
mkdir -p build || exit 1
mkdir -p ${PREFIX} || exit 1
cd build
${src_path}/configure --prefix=${PREFIX} --host=x86_64-dragonos || exit 1
make -j $(nproc) || exit 1
make DESTDIR=${sys_root} install|| exit 1
make clean
cd ..
rm -rf build

1
user/port/gcc/11.3.0/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
build-gcc/

View File

@ -0,0 +1,51 @@
##############################################
# DragonOS hosted gcc build script
#
# This script is used to build userland gcc for DragonOSRunning on Linux)
##############################################
# 编译前请先设置参数
sys_root=$DRAGONOS_SYSROOT
gcc_path=请填写gcc的路径
# 要安装到的目录
PREFIX=$HOME/opt/dragonos-host-userspace
if [ ! -d ${gcc_path} ]; then
echo "Error: ${gcc_path} not found"
exit 1
fi
if [ ! -d ${sysroot} ]; then
echo "Error: ${sysroot} not found"
exit 1
fi
# 安装依赖
# 注意texinfo和binutils的版本是否匹配
# 注意gmp/mpc/mpfr和gcc/g++的版本是否匹配
sudo apt-get install -y \
g++ \
gcc \
make \
texinfo \
libgmp3-dev \
libmpc-dev \
libmpfr-dev \
flex \
wget
mkdir -p build-gcc || exit 1
mkdir -p ${PREFIX} || exit 1
cd build-gcc
${gcc_path}/configure --prefix=${PREFIX} --target=x86_64-dragonos --with-sysroot=${sysroot} --disable-werror --disable-shared --disable-bootstrap --enable-languages=c,c++ || exit 1
make all-gcc all-target-libgcc -j $(nproc) || exit 1
make install-gcc install-target-libgcc -j $(nproc) || exit 1
# 这里会报错,暂时不知道为什么
# make all-target-libstdc++-v3 -j $(nproc) || exit 1
# make install-target-libstdc++-v3 -j $(nproc) || exit 1
make clean
cd ..
rm -rf build-gcc

View File

@ -0,0 +1,28 @@
# 编译前请先设置参数
sys_root=$DRAGONOS_SYSROOT
gmp_path=请填写gmp的路径
# 要安装到的目录
PREFIX=/usr
if [ ! -d ${gmp_path} ]; then
echo "Error: ${gmp_path} not found"
exit 1
fi
if [ ! -d ${sysroot} ]; then
echo "Error: ${sysroot} not found"
exit 1
fi
mkdir -p build-gmp || exit 1
mkdir -p ${PREFIX} || exit 1
cd build-gmp
${gmp_path}/configure --prefix=${PREFIX} --host=x86_64-dragonos || exit 1
make -j $(nproc) || exit 1
make DESTDIR=${sys_root} install|| exit 1
make clean
cd ..
rm -rf build-gmp

View File

@ -0,0 +1,35 @@
# 编译前请先设置参数
sys_root=$DRAGONOS_SYSROOT
mpc_path=请填写mpc的路径
# 要安装到的目录
PREFIX=/usr
current_path=$(pwd)
if [ ! -d ${mpc_path} ]; then
echo "Error: ${mpc_path} not found"
exit 1
fi
if [ ! -d ${sysroot} ]; then
echo "Error: ${sysroot} not found"
exit 1
fi
cd ${mpc_path}
autoreconf --install || exit 1
autoconf
sed -i 's/ios[*]/ios* | dragonos* /' build-aux/config.sub
cd ${current_path}
mkdir -p build || exit 1
mkdir -p ${PREFIX} || exit 1
cd build
${mpc_path}/configure --prefix=${PREFIX} --host=x86_64-dragonos --target=x86_64-dragonos --with-mpfr=$sys_root/usr --with-gmp=$sys_root/usr || exit 1
make -j $(nproc) || exit 1
make DESTDIR=${sys_root} install || exit 1
make clean
cd ..
rm -rf build

View File

@ -0,0 +1,37 @@
# 编译前请先设置参数
sys_root=$DRAGONOS_SYSROOT
src_path=请填写mpfr的路径
current_path=$(pwd)
# 要安装到的目录
PREFIX=/usr
if [ ! -d ${src_path} ]; then
echo "Error: ${src_path} not found"
exit 1
fi
if [ ! -d ${sysroot} ]; then
echo "Error: ${sysroot} not found"
exit 1
fi
cd ${src_path}
autoreconf --install
autoconf
sed -i 's/ios[*]/ios* | dragonos* /' config.sub
cd ${current_path}
mkdir -p build || exit 1
mkdir -p ${PREFIX} || exit 1
cd build
${src_path}/configure --prefix=${PREFIX} --host=x86_64-dragonos || exit 1
make -j $(nproc) || exit 1
make DESTDIR=${sys_root} install|| exit 1
make clean
cd ..
rm -rf build

15
user/port/pkg-config.sh Normal file
View File

@ -0,0 +1,15 @@
#!/bin/sh
# Fill these in appropriately:
ROOT_PATH=$(dirname $(dirname $(pwd)))
DRAGONOS_SYSROOT=$ROOT_PATH/bin/sysroot
export PKG_CONFIG_SYSROOT_DIR=$DRAGONOS_SYSROOT
export PKG_CONFIG_LIBDIR=$DRAGONOS_SYSROOT/usr/lib/pkgconfig
# TODO: If it works this should probably just be set to the empty string.
# export PKG_CONFIG_PATH=$PKG_CONFIG_LIBDIR
# Use --static here if your OS only has static linking.
# TODO: Perhaps it's a bug in the libraries if their pkg-config files doesn't
# record that only static libraries were built.
# exec pkg-config --static "$@"