2012-11-19

Raspi -- hardfloat - 4

Boot Raspberry Pi
Broadcom BCM2835 ARMv6

# spk-add mc
Midnight Commander - ncurses based file manager.


1.
root@slitaz:~# uname -a
Linux slitaz 3.2.14-slitaz #1 PREEMPT Wed Oct 31 14:55:53 CST 2012 armv6l GNU/Linux

2.
root@slitaz:~# dmesg | head -5
Initializing cgroup subsys cpu
Linux version 3.2.14-slitaz (root@slitaz) (gcc version 4.6.3 (SliTaz) ) #1 PREEMPT Wed Oct 31 14:55:53 CST 2012
CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
Machine: BCM2708


3.
root@slitaz:~# spk info

Spk info
================================================================================
Architecture : arm
Database : /var/lib/tazpkg/installed
Cache info : 4.0K /var/cache/tazpkg
Mirror URL : http://192.168.1.37/cross/armhf/packages/
Extra mirrors : 0
Installed : 17
================================================================================

root@slitaz:~#


4.
root@slitaz:~# spk-add mc

Using official mirror: mc-4.8.3-armhf.tazpkg
Connecting to 192.168.1.37 (192.168.1.37:80)
mc-4.8.3-armhf.tazpk 100% |*******************************| 683k 0:00:00 ETA
Missing: glib
Missing: e2fsprogs
Missing dependencies: 2

Using official mirror: glib-2.32.1-armhf.tazpkg
Connecting to 192.168.1.37 (192.168.1.37:80)
glib-2.32.1-armhf.ta 100% |*******************************| 388k 0:00:00 ETA
Missing: pcre
Missing: libffi
Missing: libxml2
Missing: elfutils
Missing dependencies: 4

Using official mirror: pcre-8.30-armhf.tazpkg
Connecting to 192.168.1.37 (192.168.1.37:80)
pcre-8.30-armhf.tazp 100% |*******************************| 79044 0:00:00 ETA
Missing dependencies: 0

Adding pcre
================================================================================
Copying package... [ Done ]
Extracting archive: 80.0K [ Done ]
Installing files: 9 [ Done ]
================================================================================
pcre 8.30 is installed

Using official mirror: libffi-3.0.11-armhf.tazpkg
Connecting to 192.168.1.37 (192.168.1.37:80)
libffi-3.0.11-armhf. 100% |*******************************| 12316 0:00:00 ETA
Missing dependencies: 0

Adding libffi
================================================================================
Copying package... [ Done ]
Extracting archive: 16.0K [ Done ]
Installing files: 3 [ Done ]
================================================================================
libffi 3.0.11 is installed


Using official mirror: libxml2-2.8.0-armhf.tazpkg
Connecting to 192.168.1.37 (192.168.1.37:80)
libxml2-2.8.0-armhf. 100% |*******************************| 385k 0:00:00 ETA
Missing dependencies: 0

Adding libxml2
================================================================================
Copying package... [ Done ]
Extracting archive: 388.0K [ Done ]
Installing files: 3 [ Done ]
================================================================================
libxml2 2.8.0 is installed


Using official mirror: elfutils-0.153-armhf.tazpkg
Connecting to 192.168.1.37 (192.168.1.37:80)
elfutils-0.153-armhf 100% |*******************************| 174k 0:00:00 ETA
Missing dependencies: 0

Adding elfutils
================================================================================
Copying package... [ Done ]
Extracting archive: 176.0K [ Done ]
Installing files: 32 [ Done ]
================================================================================
elfutils 0.153 is installed

Adding glib
================================================================================
Copying package... [ Done ]
Extracting archive: 392.0K [ Done ]
Installing files: 21 [ Done ]
================================================================================
glib 2.32.1 is installed

Adding e2fsprogs
================================================================================
Copying package... [ Done ]
Extracting archive: 292.0K [ Done ]
Modified package: busybox
Overwriting file: /sbin/tune2fs
Modified package: busybox
Overwriting file: /sbin/findfs
Installing files: 34 [ Done ]
================================================================================
e2fsprogs 1.42.3 is installed

Adding mc
================================================================================
Copying package... [ Done ]
Extracting archive: 684.0K [ Done ]
Installing files: 182 [ Done ]
================================================================================
mc 4.8.3 is installed


5.
root@slitaz:~# mc -V
GNU Midnight Commander 4.8.3
Built with GLib 2.32.4
Using the ncurses library
With builtin Editor
With subshell support as default
With support for background operations
With mouse support on xterm and Linux console
With internationalization support
With multiple codepages support
Virtual File Systems: cpiofs, tarfs, sfs, extfs, ftpfs, fish
Data types: char: 8; int: 32; long: 32; void *: 32; size_t: 32; off_t: 64;
root@slitaz:~#


6.
root@slitaz:~# readelf -A /usr/bin/mc
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "6"
Tag_CPU_arch: v6
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-1
Tag_FP_arch: VFPv2
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP
Tag_ABI_VFP_args: VFP registers
Tag_DIV_use: Not allowed
root@slitaz:~#


7.
root@slitaz:~# slitaz

SliTaz GNU/Linux
================================================================================
Release : cooking
Architecture : arm
Kernel : 3.2.14-slitaz
Boot options : dma.dmachans=0x3c bcm2708_fb.fbwidth=644 bcm2708_fb.fbheight=448 bcm2708.boardrev=0x2 bcm2708.serial=0x7b32f4ce smsc95xx.macaddr=B8:27:EB:32:F4:CE dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
Home path : /home/slitaz
Configs : /etc/slitaz
Log files : /var/log/slitaz
Packages DB : /var/lib/tazpkg
Installed : 27 packages
Mirror : http://192.168.1.37/cross/armhf/packages/
================================================================================
Config file: /etc/slitaz/slitaz.conf
.

2012-11-18

Avoiding libtool minefields when cross-compiling


Avoiding libtool minefields when cross-compiling
http://www.metastatic.org/text/libtool.html

If you've ever tried to cross-compile a free software project for a different architecture on GNU/Linux, you may well have run into the situation where you compile a library with your cross toolchain, install it in a “staging” directory that will hold your root filesystem (for example, you compile the library to go into /usr/lib, but you install it in /tmp/rootfs/usr/lib, because that's where you're building your new root filesystem. You do this correctly: specify your --prefix=/usr when you configure, but provide DESTDIR=/tmp/rootfs when you make install), and you try to compile another library that links against that library. Everything goes fine (the author of the program may have even written his configure script properly, so you can configure it to use the correct toolchain), but at the link step, you get this:

/bin/sh libtool --mode=link target-gcc -c -O2 -o libbar.so ... -lfoo
target-gcc -c -O2 -o libbar.so ... /usr/lib/libfoo.so
/usr/lib/libfoo.so: could not read symbols: File in wrong format
collect2: ld returned 1 exit status

Now, why is the command trying to link against /usr/lib/libfoo.so, which is your system's version of libfoo, and not /tmp/rootfs/usr/lib/libfoo.so? You might play with compiler and linker flags, try to hack and understand the libtool shell script (best of luck if you can decipher it), and end up cursing the ancestors of those who ever came up with such a dumb system.

The problem turns out to be that libfoo and libbar in this example both use libtool, and that the prefix happens to conflict with the system's library locations; when libtool installs a library, you'll see it installs libfoo.la.

What's with that file? You may, reasonably, expect to see one or two different kinds of library file: libfoo.a, which is just an archive of object files, and which you can statically link into your program; and libfoo.so, a dynamically loadable, sharable library. What's a .la? Just cat one, and you'll see:

$ cat /usr/lib/libesd.la
# libesd.la - a libtool library file
# Generated by ltmain.sh - GNU libtool 1.5.6 (1.1220.2.95 2004/04/11 05:50:42) Debian: 224 $
#
# Please DO NOT delete this file!
# It is necessary for linking the library.

# The name that we can dlopen(3).
dlname='libesd.so.0'

# Names of this library.
library_names='libesd.so.0.2.36 libesd.so.0 libesd.so'

# The name of the static archive.
old_library='libesd.a'

# Libraries that this one depends upon.
dependency_libs=' -L/usr/lib /usr/lib/libaudiofile.la -lm'

# Version information for libesd.
current=2
age=2
revision=36

# Is this an already installed library?
installed=yes

# Should we warn about portability when linking against -modules?
shouldnotlink=no

# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''

# Directory that this library needs to be installed in:
libdir='/usr/lib'

Notice the last line? It says that libesd is installed in /usr/lib, so when libtool finds your libfoo.la in your temporary root filesystem tree, that file tells it to go look in /usr/lib. So, you have to prevent the libtool file from confusing the libtool script at link time.

You can probably just remove the libtool library file, and rely on your linker to figure out what you mean by -lfoo (even though the .la strongly admonishes you not to delete it), but perhaps better is to just update libdir in this file to point to where your library is temporarily installed. Using GNU sed you can do this:

sed -i~ -e "s;/usr;/tmp/rootfs/usr;" /tmp/rootfs/usr/lib/libfoo.la

I do this just after installing the cross-compiled library into my temporary root filesystem tree.

You likely won't need the libtool files any more when you install (if you're targeting an embedded Linux system), so you don't care if those files are correct once installed on the target. You'll probably just remove them from the final image, anyway.

I wrote this because I spent a long night of fighting libtool, Googling for help and finding none, and finally figuring this out. This is the second time I've even figured this out, having forgotten the solution the first time. Hopefully, this will help you out if you encounter this issue.
The wrong-gcc problem

For some packages, you seem to also run into trouble where libtool can't figure out what you're doing:

$ libtool --mode=compile target-gcc -g -O2 -c foo.c
libtool: compile: unable to infer tagged configuration
libtool: compile: specify a tag with `--tag'

OK, so it couldn't figure out that we're compiling C code. No problem, just add the tag --tag=CC. Works when we compile:

$ libtool --tag=CC --mode=compile target-gcc -g -O2 -c foo.c
target-gcc -g -O2 -c foo.c -fPIC -DPIC -o .libs/foo.o
target-gcc -g -O2 -c foo.c -o foo.o >/dev/null 2>&1

But when we link, libtool tries to call the native gcc:

$ libtool --tag=CC --mode=link target-gcc -rpath /usr/lib -o libfoo.la foo.lo
gcc -shared .libs/foo.o -Wl,-soname -Wl,libfoo.so.0 -o .libs/libfoo.so.0.0.0
/usr/bin/ld: .libs/foo.o: Relocations in generic ELF (EM: 40)
/usr/bin/ld: .libs/foo.o: Relocations in generic ELF (EM: 40)
/usr/bin/ld: .libs/foo.o: Relocations in generic ELF (EM: 40)
/usr/bin/ld: .libs/foo.o: Relocations in generic ELF (EM: 40)
/usr/bin/ld: .libs/foo.o: Relocations in generic ELF (EM: 40)
/usr/bin/ld: .libs/foo.o: Relocations in generic ELF (EM: 40)
.libs/foo.o: could not read symbols: File in wrong format
collect2: ld returned 1 exit status

One rumored workaround (I haven't tried this, since I haven't had to cross compile anything in a while) is to specify a proper rpath in LDFLAGS:

-Wl,-rpath -Wl,/usr/lib -Wl,-rpath-link -Wl,${STAGING_DIR}/usr/lib -L${STAGING_DIR}/lib -L${STAGING_DIR}/usr/lib

Thanks to Waldemar Brodkorb for this workaround. Let me know if this works for you.

Another solution to this problem is to just install a cross libtool, which you'll use in preference to your system's libtool. It's easy enough to do; go grab the distribution, unpack it, and install it with:

$ tar xzf libtool-1.5.22.tar.gz
$ cd libtool-1.5.22
libtool-1.5.22 $ ./configure --prefix=/opt/Toolchain --host=target --program-prefix=target-
configure output...
libtool-1.5.22 $ make
make output...
libtool-1.5.22 $ sudo make install

Then, you can just use target-libtool when cross compiling. That libtool (which is still just a shell script, so you needn't worry about running it on the host) will be set up properly for using your target-gcc. You usually just have to add an environment variable LIBTOOL=target-libtool when you configure your package.

Happy Hacking.

Copyright © 2007, 2009 Casey Marshall
casey dot s dot marshall at gmail dot com

This is the version of March 7, 2009.

Creative Commons License
This work is licensed under a Creative Commons Attribution 3.0 United States License.

2012-11-10

raspi - hardfloat-3

ArmHardFloatPort
This page gathers thoughts and ideas around a new hard-float ABI ARM port for Debian, hopefully to be released for the the first time with Wheezy (7.0).

Contents

Current Status
Rationale
Supported devices
Background information
VFP
ARM EABI
GCC floating-point options
ld.so hwcaps
Endianess, architecture level, CPU, VFP level
Name of the port
Triplet
Performance improvements and benchmarks
NEON
Hardware
Task List
Partial reference of SoC and supported ISAs
Port naming debate notes
Compiler
Minimum CPU & FPU
Summary of Benefits

[..]
Background information

This section provides some background information on FPUs, ARM EABI, GCC floating-point ABIs, hwcaps...

Raspbian Benchmarking – armel vs armhf
Softfp and Hardfp

For ARM there are two different ABIs (Application Binary Interfaces), soft/softfp and hard. ‘soft’ doesn’t use the FPU at all and uses gcc maths replacement functions to emulate floating point arithmetic. ‘softfp’ uses the FPU but arguments to functions are passed through the integer registers and then passed to the floating point unit. ‘hard’ is using the FPU directly with data passed directly to the floating point unit registers. While soft/softfp are forwards compatible, ie. a ‘soft’ app can run on a softfp system, but not vice-versa, a ‘hardfloat’ application can run on neither of those systems. This means that in order to use hardfloat the system has to be completely recompiled for the hardfloat ABI, down to the last library and program.


Ref:
http://alanyih.blogspot.tw/2012/07/raspi-hardfloat.html
.

2012-11-07

raspi -- hardfloat / readelf

readelf -A

Tag_FP_arch: VFPv2
Tag_ABI_HardFP_use: SP and DP
Tag_ABI_VFP_args: VFP registers


softfloat
root@slitaz:~# readelf -A /home/slitaz-arm/distro/lib/libc-2.13.so
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "6"
Tag_CPU_arch: v6
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-1
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
Tag_DIV_use: Not allowed
root@slitaz:~#


VS.


hardfloat
ref: http://alanyih.blogspot.tw/2012/11/slitaz-cross-testsuite.html
[CHECKING] readelf -A test.out
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "6"
Tag_CPU_arch: v6
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-1
Tag_FP_arch: VFPv2
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP
Tag_ABI_VFP_args: VFP registers
Tag_DIV_use: Not allowed

2012-11-04

Slitaz -- cross

cross

root@slitaz:/# cross info
Tools prefix : --prefix=/cross/arm/tools
Target sysroot : --with-sysroot=/cross/arm/sysroot

Cross Toolchain information
================================================================================
Target arch : arm
C Compiler : arm-slitaz-linux-gnueabi-gcc
Build directory : /cross/arm
Tools prefix : /cross/arm/tools/bin
Arch sysroot : /cross/arm/sysroot
================================================================================

GCC version
================================================================================
Using built-in specs.
COLLECT_GCC=arm-slitaz-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/lto-wrapper
Target: arm-slitaz-linux-gnueabi
Configured with: ../gcc-4.6.3/configure --prefix=/cross/arm/tools --libexec=/cross/arm/tools/lib --target=arm-slitaz-linux-gnueabi --enable-shared --enable-c99 --enable-long-long --enable-__cxa_atexit --with-system-zlib --enable-plugin --disable-multilib --disable-libssp --disable-checking --disable-werror --with-pkgversion=SliTaz --with-bugurl=https://bugs.slitaz.org/ --with-sysroot=/cross/arm/sysroot --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-languages=c,c++
Thread model: posix
gcc version 4.6.3 (SliTaz)
================================================================================

root@slitaz:/#

Slitaz -- cross testsuite

cross testsuite

[CHECKING] file test.out
test.out: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped


root@slitaz:/# cross testsuite
Tools prefix : --prefix=/cross/arm/tools
Target sysroot : --with-sysroot=/cross/arm/sysroot
[COMPILING] arm-slitaz-linux-gnueabi-gcc -v -Wall -o test.out test.c
Using built-in specs.
COLLECT_GCC=arm-slitaz-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/lto-wrapper
Target: arm-slitaz-linux-gnueabi
Configured with: ../gcc-4.6.3/configure --prefix=/cross/arm/tools --libexec=/cross/arm/tools/lib --target=arm-slitaz-linux-gnueabi --enable-shared --enable-c99 --enable-long-long --enable-__cxa_atexit --with-system-zlib --enable-plugin --disable-multilib --disable-libssp --disable-checking --disable-werror --with-pkgversion=SliTaz --with-bugurl=https://bugs.slitaz.org/ --with-sysroot=/cross/arm/sysroot --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-languages=c,c++
Thread model: posix
gcc version 4.6.3 (SliTaz)
COLLECT_GCC_OPTIONS='-v' '-Wall' '-o' 'test.out' '-march=armv6' '-mfloat-abi=hard' '-mfpu=vfp'
/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/cc1 -quiet -v test.c -quiet -dumpbase test.c -march=armv6 -mfloat-abi=hard -mfpu=vfp -auxbase test -Wall -version -o /tmp/ccDffF34.s
GNU C (SliTaz) version 4.6.3 (arm-slitaz-linux-gnueabi)
compiled by GNU C version 4.6.3, GMP version 5.0.4, MPFR version 3.1.0-p4, MPC version 0.8.2
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=65536
ignoring nonexistent directory "/cross/arm/sysroot/usr/local/include"
#include "..." search starts here:
#include <...> search starts here:
/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/include
/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/include-fixed
/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/../../../../arm-slitaz-linux-gnueabi/include
/cross/arm/sysroot/usr/include
End of search list.
GNU C (SliTaz) version 4.6.3 (arm-slitaz-linux-gnueabi)
compiled by GNU C version 4.6.3, GMP version 5.0.4, MPFR version 3.1.0-p4, MPC version 0.8.2
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=65536
Compiler executable checksum: c79421fa632f9d876a099c488d2165db
COLLECT_GCC_OPTIONS='-v' '-Wall' '-o' 'test.out' '-march=armv6' '-mfloat-abi=hard' '-mfpu=vfp'
/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/../../../../arm-slitaz-linux-gnueabi/bin/as -march=armv6 -mfloat-abi=hard -mfpu=vfp -meabi=5 -o /tmp/cctOLj6s.o /tmp/ccDffF34.s
COMPILER_PATH=/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/:/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/:/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/:/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/:/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/:/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/../../../../arm-slitaz-linux-gnueabi/bin/
LIBRARY_PATH=/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/:/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/../../../../arm-slitaz-linux-gnueabi/lib/:/cross/arm/sysroot/lib/:/cross/arm/sysroot/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-Wall' '-o' 'test.out' '-march=armv6' '-mfloat-abi=hard' '-mfpu=vfp'
/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/collect2 --sysroot=/cross/arm/sysroot --eh-frame-hdr -dynamic-linker /lib/ld-linux.so.3 -X -m armelf_linux_eabi -o test.out /cross/arm/sysroot/usr/lib/crt1.o /cross/arm/sysroot/usr/lib/crti.o /cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/crtbegin.o -L/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3 -L/cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/../../../../arm-slitaz-linux-gnueabi/lib -L/cross/arm/sysroot/lib -L/cross/arm/sysroot/usr/lib /tmp/cctOLj6s.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /cross/arm/tools/lib/gcc/arm-slitaz-linux-gnueabi/4.6.3/crtend.o /cross/arm/sysroot/usr/lib/crtn.o

[CHECKING] file test.out
test.out: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped

[CHECKING] readelf -A test.out
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "6"
Tag_CPU_arch: v6
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-1
Tag_FP_arch: VFPv2
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP
Tag_ABI_VFP_args: VFP registers
Tag_DIV_use: Not allowed
root@slitaz:/#