LicheePiで遊ぶ　（低レベル勉強会2020年07月メモ） 


# uzullaの作業メモ

クロスコンパイルしたいぞ。

## 手元にDockerでビルド環境作ってみたい

Docker開発環境— Litchi Pie Nano完全なプロセスガイドドキュメント http://nano.lichee.pro/build_sys/docker.html#id14
Litchi Pie開発イメージというものがDockerで提供されている

http://nano.lichee.pro/build_sys/docker.html

```
$ docker pull zepan/licheepi-nano:1.0.0
※ latestがないので、1.0.0を指定するしかなかった。
$ docker images|grep lichee
zepan/licheepi-nano   1.0.0                 e118a4b675e7        22 months ago       4.75GB

うごかん…。

$ docker run --name lp3 --rm  -it zepan/licheepi-nano:1.0.0 /bin/bash
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown.


zepan/licheepi-nanoじゃなくて、zepan/licheepiでためしてみるか…

$ docker run --name lp2 --rm  -it zepan/licheepi /bin/bash
root@07f87004b787:/# uname -a
Linux 07f87004b787 4.19.76-linuxkit #1 SMP Tue May 26 11:42:35 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

うごいたけど、これarmユーザーランドエミュレーションしてなくない？

$ docker cp hello_linux_arm_goarm5 07:/

root@07f87004b787:/# ./hello_linux_arm_goarm5
Hello world
あ、いや、arm5のバイナリうごくな、なるほど。

## Hello worldを手元でビルド

開発環境というのにgccは普通にamd64がだされてしまったので、arm-linux-gnueabihf-gccを使う（これはLinuxのカーネルビルド用のDockerなのかな）

root@07f87004b787:~/tmp# cat hello.c
#include <stdio.h>

int main(int argc, char *args[])
{
    printf("Hello, world!\n");
    return 0;
}
root@07f87004b787:~/tmp# arm-linux-gnueabihf-gcc ./hello.c  -static
root@07f87004b787:~/tmp# file ./a.out
./a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=9845bf3c9286c72187ab344d93f0786b7a512a1a, not stripped
root@07f87004b787:~/tmp# ./a.out
Hello, world!

（static指定しないと、Dockerのランタイム上ではうごかなかった）

しかし、スタティックリンクすると、でかい…
-rwxr-xr-x 1 root root 3.8M Jul 23 05:36 a.out

非スタティックリンクだと
-rwxr-xr-x 1 root root 9.8K Jul 23 05:38 a.out
4Mbyteと10Kbyteでは桁が2〜3桁違うｗ

### uuencodeで転送
local
$ uuencode a.out a.uu

remote
# cat > a.uu
{ペースト}
# uudecode -o a.out a.uu
# ./a.out
-sh: ./a.out: not found

??? notfoundとは？？？

うーん、ちゃんとコピーして実行するもの、永遠に帰ってこない。（実行してももどってこない）


### ldconfig -v

# ldconfig -v
ldconfig: uClibc version
/lib:
        libgcc_s.so.1 => libgcc_s.so.1
        libatomic.so.1 => libatomic.so.1.2.0
        libc.so.0 => libuClibc-1.0.28.so
        libc.so.6 => libc-2.18.so
        ld-uClibc.so.1 => ld-uClibc-1.0.28.so
        ld-linux.so.3 => ld-2.18.so
/usr/lib:
ldconfig: /usr/lib/libstdc++.so.6.0.22-gdb.py is not a shared library, skipping
        libexpat.so.1 => libexpat.so.1.6.7
        libcrypto.so.1.0.0 => libcrypto.so.1.0.0
        libnl-xfrm-3.so.200 => libnl-xfrm-3.so.200.26.0
        libz.so.1 => libz.so.1.2.11
        libssl.so.1.0.0 => libssl.so.1.0.0
        libnl-nf-3.so.200 => libnl-nf-3.so.200.26.0
        libpcap.so.1 => libpcap.so.1.8.1
        libnl-idiag-3.so.200 => libnl-idiag-3.so.200.26.0
        libstdc++.so.6 => libstdc++.so.6.0.22
        libnl-genl-3.so.200 => libnl-genl-3.so.200.26.0
        libnl-route-3.so.200 => libnl-route-3.so.200.26.0
        libnl-3.so.200 => libnl-3.so.200.26.0
/usr/X11R6/lib:
ldconfig: skipping /usr/X11R6/lib: No such file or directory

# ldd hello_linux_arm_goarm5
        not a dynamic executable
# ldd hello_static
        not a dynamic executable
# ldd a.out
checking sub-depends for '/lib/libc.so.6'
        /lib/ld-linux.so.3 (0xb6fa9000)
        libc.so.6 => /lib/libc.so.6 (0x00000000)
        /lib/ld-linux.so.3 => /lib/ld-linux.so.3 (0x00000000)


### メモリ消費量めも（Go）

#  /usr/bin/time -f "%M KB" ./hello_linux_arm_goarm5
Hello world
5488 KB