Docker rootfs
FROM scratch
LABEL \
org.opencontainers.image.title="Buildroot Base Image" \
org.opencontainers.image.vendor="Buildroot 2025.02" \
org.opencontainers.image.licenses="Apache" \
org.opencontainers.image.created="2025-08-01" \
maintainer="slackman@disroot.org"
ADD rootfs.tar /
CMD ["/bin/sh"]
问题:还是不能运行动态库
docker build -t root .
docker run -it --rm root
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
安装 buildroot
整体而言,从零制作一个工具链,对嵌入式的知识掌握还是需要深入的掌握,
另外,工具链对整个系统代码的稳定性有着极大的影响,所以直接用自动制作的工具链,一定要经过严格的压力测试,否则容易出现各种隐患。
因而,采用第三方制作好的,有专门公司维护的工具链,应该是一个更为有效的开发方式。
参考 Dockerfile
ENV DEBIAN_FRONTEND=noninteractive \
FORCE_UNSAFE_CONFIGURE=1 \
TZ=Asia/Shanghai \
SDK=buildroot-2025.02
RUN apt-get update && apt-get install -y --no-install-recommends tzdata language-pack-en \
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone \
&& dpkg-reconfigure -f noninteractive tzdata
# Install base-devel
RUN apt-get install -y \
build-essential less wget curl file \
vim git zip unzip rsync cpio bc \
dialog ncurses-base ncurses-bin libncurses5-dev \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
ARG CHECKSUM=f9444c2e3054e0b3d0f555ab8130520bd08cdb95196233672b52b9569d14c97f
WORKDIR /build
ADD --checksum=sha256:${CHECKSUM} https://buildroot.org/downloads/${SDK}.tar.gz .
RUN tar -xf ${SDK}.tar.gz && cd ${SDK} \
&& make defconfig \
&& make source
默认 Buildin toolchain (成功)
不能运行hello, 没有ldd
root@ubuntu22:/mnt/buildroot-2025.02# ls output/
build host images staging target
root@ubuntu22:/mnt/buildroot-2025.02# du -sh output/
6.7G output/
# ls -lh images/
-rw-r--r-- 1 root root 5.1M 8月 1 15:09 rootfs.tar
# target/bin target/sbin
usr/bin
usr/sbin
都是busybox链接
lib/libc.so.6
lib/libm.so.6
etc/os-release
etc/hostname
etc/fstab
etc/inittab
etc/init.d/rcS
使用 Ubuntu toolchain (报错)
External toolchain / Custom Toolchain / Pre-Install Toolchain
x86_64-linux-gnu-gcc
PREFIX: x86_64-linux-gnu
External toolchain library: glibc
gcc 11
kernel 5.15
enable: C++ Support
enable: OpenMP Support
disable: RPC
使用 3rd toolchain (成功)
https://toolchains.bootlin.com/
x86-64--musl--stable-2024.02-1.tar.bz2 不能运行hello, 没有ldd
toolchain path: /mnt/musl-stable
x86_64-linux-gcc
PREFIX: x86_64-linux
gcc 12
kernel 4.19
enable: C++ Support
enable: OpenMP Support
enable: Fortran Support
x86-64--glibc--stable-2024.05-1.tar.xz 可以运行hello,有/usr/bin/ldd
toolchain path: /mnt/glibc-stable
x86_64-linux-gcc
PREFIX: x86_64-linux
gcc 13
kernel 4.19
enable: C++ Support
enable: OpenMP Support
disable: Fortan support
disable: RPC Support
ERROR disable BR2_TOOLCHAIN_EXTERNAL_INET_RPC
======
# ls -lh /
lib64 -> lib
# ls lib
ld-linux-x86-64.so.2 libc.so.6 libmvec.so.1 libpthread.so.0
libanl.so.1 libdl.so.2 libnsl.so.1 libresolv.so.2
libatomic.so.1 libgcc_s.so.1 libnss_dns.so.2 librt.so.1
libatomic.so.1.2.0 libm.so.6 libnss_files.so.2 libutil.so.1
# ldd hello
linux-vdso.so.1 (0x00007ffc54532000)
libc.so.6 => /lib64/libc.so.6 (0x000078af56817000)
/lib64/ld-linux-x86-64.so.2 (0x000078af569fd000)