这次来研究一下静态编译
看一下golang小程序依赖的库
crawl1源代码来自:https://github.com/Chaniel/gopl.io/tree/master/ch8/crawl1
$ ldd crawl1
linux-vdso.so.1 => (0x00007ffc705ae000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f40023f5000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4002033000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4002618000)
再看一下C语言的静态编译
由于编译静态文件必须依赖libc.a文件,所以先安装libc.a在/usr/lib64目录下, 安装有2种方法。
- 不多说,yum install glibc-static
- 找一下,碰碰运气。
$ locate libc.a
/var/lib/docker/overlay/1927d2466c34101e3acdc00cfb3704d66dd5700c72608b8c8cf75f0a0c9e6534/root/usr/lib/x86_64-linux-gnu/libc.a
/var/lib/docker/overlay/2c7c3948376d6acf33b41abc4f614506cd6a1a49fd47ac23709127dbffc79432/root/usr/share/doc/libklibc/README.klibc.arch
/var/lib/docker/overlay/3fb9ff7b62d8169bdef936d5622c9210eb9787b6225c3509e5d08b0056dae4e8/root/usr/lib/x86_64-linux-gnu/libc.a
/var/lib/docker/overlay/467e1eb348b131aaeabd0e13bf9e8fd2a779bd6a0d58a7d5595788bdb1e79d30/root/usr/lib/x86_64-linux-gnu/libc.a
/var/lib/docker/overlay/59ecd4f4ce2ccee49679e3ec437fd4621ed791a57b85766becf096596353d271/root/usr/lib/x86_64-linux-gnu/libc.a
/var/lib/docker/overlay/6c407f7c91bee71bad9ad5cd46dad70e82eb7239d8701f62dc40af1197f08e13/root/usr/lib/x86_64-linux-gnu/libc.a
发现docker用了libc.a,直接拿过来用了,居然每个overlay都有一个libc.a,有没有顿时感觉浪费了很多磁盘空间呢?
开始编译,使用的代码在:https://github.com/Chaniel/hfc/tree/master/ch8-static-dynamic-lib/count_calorie
$ make -f makefile.static
$ ldd elliptical
not a dynamic executable
其实不用这么麻烦,bash的内建命令cd就是静态链接的,而ls是动态链接的。
$ ldd `which cd`
本文要点
- 查看库依赖使用ldd命令
静态链接的程序显示为:not a dynamic executable,动态链接的程序则显示相应的依赖库。
- docker的那么多overlay,每一个overlay都有一个libc.a,是不是很浪费磁盘空间呢?