完善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

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