最近在做Docker镜像的时候发现镜像文件非常大,需要找出程序的依赖库,减少程序的大小,所以整理了一下相关的工具。基本上这些工具都在GNU Binutils中。
GNU Binary Utilities或binutils是一整套的编程语言工具程序,用来处理许多格式的目标文件。当前的版本原本由在Cygnus Solutions的程序员以Binary File Descriptor library(libbfd)所撰写。这个工具程序通常搭配GCC、make、和GDB这些程序来使用。
它包含20个左右的工具,本文介绍了我在创建Docker镜像的时候的使用的几种工具。
ldd
ldd不是GNU Binutils工具集中的一个工具,但是却是一个非常有用的工具, 它可以显示程序或者共享库所需的共享库。
例如:
|
|
依照ldd得手册, 有时候ldd会通过执行程序来获取依赖信息,对于来源不明的程序,执行这些程序可能会带来风险,所以对于来源不明的程序,可以使用objdump
来分析。
objdump
onjdump可以显示目标文件的信息,可以通过参数控制要显示的内容。
比如-p
可以显示文件头内容, 通过grep
可以查看依赖的库。
|
|
甚至可以查看-T
可以查看动态符号表的内容:
|
|
nm
nm显示目标文件的符号。
|
|
strings
strings显示文件中的可打印字符。
|
|
strip
通过上面的工具,可以分析出文件的依赖库,创建Docker镜像的时候只需把所需的依赖库加进去即可。
如果程序本身比较大,可以将程序压缩,去掉不需要的一些数据, 比如使用strip
进行裁剪。
你可以通过参数控制要丢掉的哪些符号。
比如去除符号表和行号信息:
|
|
libtool
Linux下的GNU Libtool是一种属于GNU建构系统的GNU程序设计工具,用来产生便携式的库。这里引用libtool手册的说明:
|
|
MacOS下的libtool时另外一个工具,可以用来创建库:
|
|
ar
可以对静态库做创建、修改和提取的操作。
|
|
otool
比nm更强大,mac还有一个对应的图形化工具——MachOView。
查看依赖动态库:
|
|
查看反汇编代码段:
|
|