uzullaの作業メモ
クロスコンパイルしたいぞ。
手元にDockerでビルド環境作ってみたい
Docker開発環境— Litchi Pie Nano完全なプロセスガイドドキュメント http://nano.lichee.pro/build_sys/docker.html#id14
Litchi Pie開発イメージというものがDockerで提供されている
$ 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桁違うw
### 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