编译静态BusyBox时缺失库的解决方法咨询(CentOS 8环境)
问题
使用qemu_8.0.2 + gdb + busybox_1.32.0调试内核时,启动出现内核恐慌:
Kernel panic - not syncing: No working init found.
为解决该问题,开启BusyBox的「Build static binary (no shared libs)」选项编译,却遇到以下错误:
LINK busybox_unstripped Your linker does not support --sort-section,alignment Your linker does not support --sort-common Static linking against glibc, can't use --gc-sections Trying libraries: crypt m resolv rt Failed: -Wl,--start-group -lcrypt -lm -lresolv -lrt -Wl,--end-group Output of: gcc -Wall -Wshadow -Wwrite-strings -Wundef -Wstrict-prototypes -Wunused -Wunused-parameter -Wunused-function -Wunused-value -Wmissing-prototypes -Wmissing-declarations -Wno-format-security -Wdeclaration-after-statement -Wold-style-definition -finline-limit=0 -fno-builtin-strlen -fomit-frame-pointer -ffunction-sections -fdata-sections -fno-guess-branch-probability -funsigned-char -static-libgcc -falign-functions=1 -falign-jumps=1 -falign-labels=1 -falign-loops=1 -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-builtin-printf -Os -static -o busybox_unstripped -Wl,--start-group applets/built-in.o archival/lib.a archival/libarchive/lib.a console-tools/lib.a coreutils/lib.a coreutils/libcoreutils/lib.a debianutils/lib.a klibc-utils/lib.a e2fsprogs/lib.a editors/lib.a findutils/lib.a init/lib.a libbb/lib.a libpwdgrp/lib.a loginutils/lib.a mailutils/lib.a miscutils/lib.a modutils/lib.a networking/lib.a networking/libiproute/lib.a networking/udhcp/lib.a printutils/lib.a procps/lib.a runit/lib.a selinux/lib.a shell/lib.a sysklogd/lib.a util-linux/lib.a util-linux/volume_id/lib.a archival/built-in.o archival/libarchive/built-in.o console-tools/built-in.o coreutils/built-in.o coreutils/libcoreutils/built-in.o debianutils/built-in.o klibc-utils/built-in.o e2fsprogs/built-in.o editors/built-in.o findutils/built-in.o init/built-in.o libbb/built-in.o libpwdgrp/built-in.o loginutils/built-in.o mailutils/built-in.o miscutils/built-in.o modutils/built-in.o networking/built-in.o networking/libiproute/built-in.o networking/udhcp/built-in.o printutils/built-in.o procps/built-in.o runit/built-in.o selinux/built-in.o shell/built-in.o sysklogd/built-in.o util-linux/built-in.o util-linux/volume_id/built-in.o -Wl,--end-group -Wl,--start-group -lcrypt -lm -lresolv -lrt -Wl,--end-group ========== /bin/ld: cannot find -lcrypt /bin/ld: cannot find -lm /bin/ld: cannot find -lresolv /bin/ld: cannot find -lrt collect2: error: ld returned 1 exit status Note: if build needs additional libraries, put them in CONFIG_EXTRA_LDLIBS. Example: CONFIG_EXTRA_LDLIBS="pthread dl tirpc audit pam" make: *** [Makefile:718: busybox_unstripped] Error 1
当前环境为gcc 8.5.0 + CentOS 8,已尝试yum install libgcrypt但未解决-lcrypt缺失问题,需解决这些库的安装问题。
解决方案
1. 安装缺失的静态库开发包
CentOS 8中,静态编译所需库对应的开发包如下:
-lcrypt:由libxcrypt-devel提供(你之前安装的libgcrypt是独立加密库,与该依赖无关)-lm、-lresolv、-lrt:均属于glibc-devel包
执行以下命令安装:
sudo dnf install libxcrypt-devel glibc-devel
(习惯用yum的话,替换dnf为yum即可,CentOS 8中两者兼容)
2. 重新编译BusyBox
安装完成后,回到BusyBox源码目录,执行:
make clean && make menuconfig
确认Settings -> Build Options下的Build static binary (no shared libs)已勾选,保存配置后编译:
make && make install
3. 解决内核恐慌补充
编译完成后,需确保根文件系统中存在/init软链接指向BusyBox,或在启动内核时通过init=/bin/busybox参数指定init程序,避免再次触发No working init found错误。
内容的提问来源于stack exchange,提问作者Frontier_Setter
相关产品推荐
相关产品推荐

