http://lp007819.wordpress.com/2012/02/23/%E7%BC%96%E8%AF%91busybox/
在openSuSE11.2 上编译 ,采用静态编译的方式。
最后链接的阶段报错:
LINK busybox_unstripped
Trying libraries: crypt m
Failed: -Wl,–start-group -lcrypt -lm -Wl,–end-group
Output of:
gcc -Wall -Wshadow -Wwrite-strings -Wundef -Wstrict-prototypes -Wunused -Wunused-parameter -Wunused-function -Wunused-value -Wmissing-prototypes -Wmissing-declarations -Wdeclaration-after-statement -Wold-style-definition -fno-builtin-strlen -finline-limit=0 -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 -Os -static -o busybox_unstripped -Wl,–sort-common -Wl,–sort-section,alignment -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 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 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 -Wl,–end-group
==========
/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/bin/ld: cannot find -lcrypt
/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/bin/ld: cannot find -lm
collect2: ld returned 1 exit status
make: *** [busybox_unstripped] Error 1
在centos 5.6 上编译 ,采用静态编译的方式。以及在openSuSE11.2 交叉编译到mipsel 平台上 ,采用静态编译的方式,却都没有问题。
看到-lXXX 的错误我就想到so没有链接正确,对比openSuSE 和CentOS ldconfig如下:
libm.so.6 (libc6,x86-64, OS ABI: Linux 2.6.16) => /lib64/libm.so.6
libm.so.6 (libc6, OS ABI: Linux 2.6.16) => /lib/libm.so.6
libm.so (libc6,x86-64, OS ABI: Linux 2.6.16) => /usr/lib64/libm.so
libm.so.6 (libc6,x86-64, OS ABI: Linux 2.6.9) => /lib64/libm.so.6
libm.so.6 (libc6, hwcap: 0×0018000000000000, OS ABI: Linux 2.6.9) => /lib/i686/nosegneg/libm.so.6
libm.so.6 (libc6, OS ABI: Linux 2.6.9) => /lib/libm.so.6
libm.so (libc6,x86-64, OS ABI: Linux 2.6.9) => /usr/lib64/libm.so
libm.so (libc6, OS ABI: Linux 2.6.9) => /usr/lib/libm.so
貌似openSuSE 缺少libm.so 的x86 链接 ,于是ln -s /lib/libm.so.6 /usr/lib/libm.so 但问题依旧。
另外一个就是红色标注的那个了,我尝试在CentOS 中删除这个链接,好像也不影响编译。
后来无意间发现CentOS 及 mips编译链中都有libm.a ,在想到我编译busybox为静态方式 。所以… 赶紧find 下openSuSE的库文件,果然没有libm.a 。 用rpm -qf 找到libm.a 属于CentOS 的glibc-devel 包 ,但在openSuSE 下属于glibc-devel-static包 ~~~ 这个真是把人害苦了。
在Fedora 16下,使用yum provides */libcrypt.a,提供该库的包是glibc-static
接下来继续报错:
networking/lib.a(nslookup.o): In function `print_host’:
nslookup.c:(.text.print_host+0x3f): warning: Using ‘getaddrinfo’ in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
networking/lib.a(ipcalc.o): In function `ipcalc_main’:
ipcalc.c:(.text.ipcalc_main+0×201): warning: Using ‘gethostbyaddr’ in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
util-linux/lib.a(mount.o): In function `nfsmount’:
mount.c:(.text.nfsmount+0xd4): warning: Using ‘gethostbyname’ in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
networking/lib.a(inetd.o): In function `reread_config_file’:
inetd.c:(.text.reread_config_file+0x75b): warning: Using ‘getservbyname’ in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
networking/lib.a(netstat.o): In function `ip_port_str’:
netstat.c:(.text.ip_port_str+0x3e): warning: Using ‘getservbyport’ in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
networking/lib.a(inetd.o): In function `reread_config_file’:
inetd.c:(.text.reread_config_file+0x6dd): warning: Using ‘getrpcbyname’ in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
networking/lib.a(inetd.o): In function `unregister_rpc’:
inetd.c:(.text.unregister_rpc+0x1f): undefined reference to `pmap_unset’
networking/lib.a(inetd.o): In function `register_rpc’:
inetd.c:(.text.register_rpc+0×57): undefined reference to `pmap_unset’
inetd.c:(.text.register_rpc+0×73): undefined reference to `pmap_set’
networking/lib.a(inetd.o): In function `prepare_socket_fd’:
inetd.c:(.text.prepare_socket_fd+0x7e): undefined reference to `bindresvport’
util-linux/lib.a(mount.o): In function `xdr_fhstatus’:
mount.c:(.text.xdr_fhstatus+0xb): undefined reference to `xdr_u_int’
mount.c:(.text.xdr_fhstatus+0x2a): undefined reference to `xdr_opaque’
util-linux/lib.a(mount.o): In function `xdr_dirpath’:
mount.c:(.text.xdr_dirpath+0×6): undefined reference to `xdr_string’
util-linux/lib.a(mount.o): In function `xdr_mountres3′:
mount.c:(.text.xdr_mountres3+0xa): undefined reference to `xdr_enum’
mount.c:(.text.xdr_mountres3+0×29): undefined reference to `xdr_bytes’
mount.c:(.text.xdr_mountres3+0×42): undefined reference to `xdr_int’
mount.c:(.text.xdr_mountres3+0×50): undefined reference to `xdr_array’
util-linux/lib.a(mount.o): In function `nfsmount’:
mount.c:(.text.nfsmount+0×845): undefined reference to `pmap_getmaps’
mount.c:(.text.nfsmount+0x9de): undefined reference to `clntudp_create’
mount.c:(.text.nfsmount+0xa2f): undefined reference to `clnttcp_create’
mount.c:(.text.nfsmount+0xa56): undefined reference to `clnt_spcreateerror’
mount.c:(.text.nfsmount+0xa68): undefined reference to `authunix_create_default’
mount.c:(.text.nfsmount+0xaeb): undefined reference to `clnt_sperror’
mount.c:(.text.nfsmount+0xb12): undefined reference to `clnt_sperror’
mount.c:(.text.nfsmount+0xca5): undefined reference to `bindresvport’
mount.c:(.text.nfsmount+0xcee): undefined reference to `pmap_getport’
collect2: ld returned 1 exit status
make: *** [busybox_unstripped] Error 1
好像是和glibc版本过高有关,找不到相关函数,这个好办,make menuconfig 去掉如下选项
Linux System Utilities —> [ ] Support mounting NFS file systems 网络文件系统
Networking Utilities —> [ ] inetd (Internet 超级服务器 )
然后就ok 了,不过这两个错误在CentOS 和mispel 交叉编译链中都没有出现。