1
votes

I'm trying to cross compile busy box V 1.27.2 for my embedded Linux device. I set share library build and cross compiler prefix and Sysroot to my compiler destinations. Compiler after trying to compile most library files is unable to link them.I received this:

Trying libraries: crypt m
Failed: -Wl,--start-group  -lcrypt -lm  -Wl,--end-group
Output of:
/home/bluebird/brcm-armtools-64bit/tools/le_arm11_external_20090306/bin/arm-brcm-linux-gnueabi-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 -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 -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-builtin-printf -Os -fpic -fvisibility=hidden --sysroot=/home/bluebird/brcm-armtools-64bit/tools/le_arm11_external_20090306/sysroot -o busybox_unstripped -Wl,--sort-common -Wl,--sort-section,alignment -Wl,--gc-sections -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
==========
coreutils/lib.a(mktemp.o): In function `mktemp_main':
mktemp.c:(.text.mktemp_main+0xbc): warning: the use of `mktemp' is dangerous, better use `mkstemp'
coreutils/lib.a(touch.o): In function `touch_main':
touch.c:(.text.touch_main+0x1f4): warning: warning: lutimes is not implemented and will always fail
util-linux/lib.a(nsenter.o): In function `nsenter_main':
nsenter.c:(.text.nsenter_main+0x1b4): undefined reference to `setns'
coreutils/lib.a(sync.o): In function `sync_main':
sync.c:(.text.sync_main+0x9c): undefined reference to `syncfs'
collect2: 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: *** [busybox_unstripped] Error 1

Also I have libm.so in my sysroot dir.

EDIT: I also try buildroot,but it needs some information about processor(e.g. endian, detailed version,etc.) which I am not aware,this is a black box device and I only develope app on it, total information I have is it run on the BCM5892 ,an ARM11 secure processor from broadcom.it runs on kenel V 2.6 and arm-brcm-linux-gnueabi V4.4.2 compiler, I also correctly set sysroot and cross compiler prefix,but how could I know which version of libc I'm using ?

2
If your embedded Linux device is using an older version of uclibc, it probably doesn't have setns and syncfs. - n. 1.8e9-where's-my-share m.
I'm using kernel V2.6 and arm-brcm-linux-gnueabi V4.4.2,Do you mean uclibc used in compilation process? how can I recognize of it's version? - MHD
Append information about your environment (environment variables), and versions of libraries used, and compiler (and libc used). I nice way to build it could be through buildroot, that for sure many of the problems you can get building would be fixed. - Alejandro Visiedo García
@AlejandroVisiedo Thank you for answer,I also try buildroot,but it needs some information about processor(e.g. endian, detailed version,etc.) which I am not aware,this is a black box device and I only develope app on it, total information I have is it run on the BCM5892 ,an ARM11 secure processor from broadcom.it runs on kenel V 2.6 and arm-brcm-linux-gnueabi V4.4.2 compiler, I also correctly set sysroot and cross compiler prefix,but how could I know which version of libc I'm using ? - MHD

2 Answers

0
votes

Open busybox menuconfig and disable "Enable -d and -f flags"

[*] sync (3.8 kb)                                                                                                              
[ ]   Enable -d and -f flags (requires syncfs(2) in libc) 

Uning a more recent verisons of uclibc (> 0.9.33) can allow to enable the option.

-1
votes

You can detect your glibc Version by inspecting the names of this link targets:

root@debianxc:/usr/src/busybox# file /opt/STM/STLinux-2.4/devkit/sh4/target/lib/libc.so.6
/opt/STM/STLinux-2.4/devkit/sh4/target/lib/libc.so.6: symbolic link to libc-2.10.2.so
root@debianxc:/usr/src/busybox# file /opt/STM/STLinux-2.4/devkit/sh4/target/lib/ld-linux.so.2
/opt/STM/STLinux-2.4/devkit/sh4/target/lib/ld-linux.so.2: symbolic link to ld-2.10.2.so

This indicates a glibc Version of 2.10.2. But to get sure you can also do:

root@debianxc:/usr/src/busybox# strings /opt/STM/STLinux-2.4/devkit/sh4/target/lib/libc.so.6 | grep '^GLIBC_' | sort | uniq
GLIBC_2.10
GLIBC_2.2
GLIBC_2.2.1
GLIBC_2.2.2
GLIBC_2.2.3
GLIBC_2.2.4
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_PRIVATE
root@debianxc:/usr/src/busybox# strings /opt/STM/STLinux-2.4/devkit/sh4/target/lib/ld-linux.so.2 | grep '^GLIBC_' | sort | uniq
GLIBC_2.2
GLIBC_2.3
GLIBC_2.4
GLIBC_PRIVATE

As I experienced a similar issue when compiling busybox-1.30.1 for SH4 Kernel 2.6.32.59, I had had to prevent nsenter.c and sync.c from becoming compiled by the Makefile.

So in your case, you could try to change your .config file.

root@debianxc:/usr/src/busybox# diff -d .config_from_defconfig .config
4c4
< # Wed Apr  3 20:04:24 2019
---
> # Wed Apr  3 20:09:45 2019
273c273
< CONFIG_MKTEMP=y
---
> # CONFIG_MKTEMP is not set
304,305c304,305
< CONFIG_SYNC=y
< CONFIG_FEATURE_SYNC_FANCY=y
---
> # CONFIG_SYNC is not set
> # CONFIG_FEATURE_SYNC_FANCY is not set
316,318c316,318
< CONFIG_TOUCH=y
< CONFIG_FEATURE_TOUCH_NODEREF=y
< CONFIG_FEATURE_TOUCH_SUSV3=y
---
> # CONFIG_TOUCH is not set
> # CONFIG_FEATURE_TOUCH_NODEREF is not set
> # CONFIG_FEATURE_TOUCH_SUSV3 is not set
667c667
< CONFIG_NSENTER=y
---
> # CONFIG_NSENTER is not set

These are the steps you could follow:

#Backup your .config
cp .config .config.backup

#Create a new config with this sed command. You will see its effect by the follow-up diff command below...
sed -e '/^\(CONFIG_\)\(\(MKTEMP\)\|\(TOUCH\)\|\(NSENTER\)\|\(SYNC\)\)=.*$/s/^\([^=]*\)=.*$/# \1 is not set/' .config >.newconfig

#With this diff output you will see its effect
diff -d .config .newconfig

#Overwrite current .config with .newconfig
cp .newconfig .config

#Now run make oldconfig, because some disablings need auto-disablings of other depending configs, too...
make oldconfig

#See the effect ...
diff -d .config.old .config

#make clean before re-compiling
make clean

#make busybox with cross-compiler
make CROSS_COMPILE=sh4-linux-

#Your new busybox is located in your working direktory

#Optionally invoke make install to create dir tree with symlinks
make CROSS_COMPILE=sh4-linux- install

#Tree's name is _install

Hope this helps.