Thinking About Docker 2

这次来研究一下静态编译

看一下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种方法。

  1. 不多说,yum install glibc-static
  2. 找一下,碰碰运气。
$ 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,是不是很浪费磁盘空间呢?