ldd、objdump、nm、strings、strip等工具

來源:互聯網
上載者:User

最近在做Docker鏡像的時候發現鏡像檔案非常大,需要找出程式的依賴庫,減少程式的大小,所以整理了一下相關的工具。基本上這些工具都在GNU Binutils中。

GNU Binary Utilities或binutils是一整套的程式設計語言工具程式,用來處理許多格式的目標檔案。當前的版本原本由在Cygnus Solutions的程式員以Binary File Descriptor library(libbfd)所撰寫。這個工具程式通常搭配GCC、make、和GDB這些程式來使用。

它包含20個左右的工具,本文介紹了我在建立Docker鏡像的時候的使用的幾種工具。

ldd

ldd不是GNU Binutils工具集中的一個工具,但是卻是一個非常有用的工具, 它可以顯示程式或者共用庫所需的共用庫。

例如:

12345
   # ldd mainlinux-vdso.so.1 =>  (0x00007ffc88fd4000)libpthread.so.0 => /lib64/libpthread.so.0 (0x00007faee13b8000)libc.so.6 => /lib64/libc.so.6 (0x00007faee0feb000)/lib64/ld-linux-x86-64.so.2 (0x00007faee15d4000)

依照ldd得手冊, 有時候ldd會通過執行程式來擷取依賴資訊,對於來源不明的程式,執行這些程式可能會帶來風險,所以對於來源不明的程式,可以使用objdump來分析。

objdump

onjdump可以顯示目標檔案的資訊,可以通過參數控制要顯示的內容。

比如-p可以顯示檔案頭內容, 通過grep可以查看依賴的庫。

1234
# objdump -p  main|grep GLIBC0x09691a75 0x00 02 GLIBC_2.2.50x09691972 0x00 03 GLIBC_2.3.20x09691a75 0x00 04 GLIBC_2.2.5

甚至可以查看-T可以查看動態符號表的內容:

1234567891011121314
# objdump -T  main|grep GLIBC0000000000000000      DO *UND*0000000000000000  GLIBC_2.2.5 stderr0000000000000000      DO *UND*0000000000000000  GLIBC_2.2.5 fwrite0000000000000000      DO *UND*0000000000000000  GLIBC_2.2.5 vfprintf0000000000000000      DO *UND*0000000000000000  GLIBC_2.2.5 fputc0000000000000000      DO *UND*0000000000000000  GLIBC_2.2.5 abort0000000000000000      DO *UND*0000000000000000  GLIBC_2.2.5 pthread_mutex_lock0000000000000000      DO *UND*0000000000000000  GLIBC_2.3.2 pthread_cond_wait0000000000000000      DO *UND*0000000000000000  GLIBC_2.2.5 pthread_mutex_unlock0000000000000000      DO *UND*0000000000000000  GLIBC_2.3.2 pthread_cond_broadcast0000000000000000      DO *UND*0000000000000000  GLIBC_2.2.5 pthread_create0000000000000000      DO *UND*0000000000000000  GLIBC_2.2.5 nanosleep0000000000000000      DO *UND*0000000000000000  GLIBC_2.2.5 pthread_detach......

nm

nm顯示目標檔案的符號。

12345678910111213141516171819202122
# nm go/bin/glide |more0000000000908680 r andMask0000000000901d00 r bswapMask00000000009036c0 r BSWAP_SHUFB_CTL0000000000b000e0 B bufio.ErrAdvanceTooFar0000000000b000f0 B bufio.ErrBufferFull0000000000b00100 B bufio.ErrFinalToken0000000000b00110 B bufio.ErrInvalidUnreadByte0000000000b00120 B bufio.ErrInvalidUnreadRune0000000000b00130 B bufio.ErrNegativeAdvance0000000000b00140 B bufio.ErrNegativeCount0000000000b00160 B bufio.errNegativeRead0000000000b00170 B bufio.errNegativeWrite0000000000b00150 B bufio.ErrTooLong00000000004d9140 T bufio.init0000000000b21120 B bufio.initdone.00000000004d6510 T bufio.(*Reader).Buffered00000000004d59d0 T bufio.(*Reader).Discard00000000004d5590 T bufio.(*Reader).fill00000000004d57c0 T bufio.(*Reader).Peek00000000004d5b70 T bufio.(*Reader).Read......

strings

strings顯示檔案中的可列印字元。

1234
# strings main|grep GLIBCGLIBC_2.2.5GLIBC_2.3.2GLIBC_2.2.5

strip

通過上面的工具,可以分析出檔案的依賴庫,建立Docker鏡像的時候只需把所需的依賴庫加進去即可。

如果程式本身比較大,可以將程式壓縮,去掉不需要的一些資料, 比如使用strip進行裁剪。

你可以通過參數控制要丟掉的哪些符號。
比如去除符號表和行號資訊:

1
strip main
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.