iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 18
0

前情提要


昨日介紹了 strip,原訂今日緊接著實作的部份,但是因為時間分配的考量,筆者先繼續介紹其他的工具程式。今日的主角是:nm。

使用方法與功能介紹


從之前實作組譯器 as 到昨日介紹的 strip,都反覆的提及連結需要標籤,那麼有沒有什麼方法可以直接看看這些標籤呢?nm 就是為了這個需求而生!

以昨日的 a.outb.out(被 strip 過的 a.out) 為例,分別使用 GNU 的 nm,可以得到

$ riscv64-unknown-linux-gnu-nm a.out
0000000000011e30 d _DYNAMIC
0000000000012020 d _GLOBAL_OFFSET_TABLE_
0000000000012028 G _IO_stdin_used
0000000000010330 t _PROCEDURE_LINKAGE_TABLE_
00000000000104f0 r __FRAME_END__
00000000000104b4 r __GNU_EH_FRAME_HDR
0000000000012000 D __TMC_END__
0000000000012038 B __bss_start
0000000000012000 D __data_start
00000000000103f8 t __do_global_dtors_aux
0000000000011e28 t __do_global_dtors_aux_fini_array_entry
0000000000012030 G __dso_handle
0000000000011e20 t __frame_dummy_init_array_entry
0000000000012828 G __global_pointer$
0000000000011e28 t __init_array_end
0000000000011e20 t __init_array_start
00000000000104aa T __libc_csu_fini
0000000000010452 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.26
0000000000012038 G _edata
0000000000012040 B _end
0000000000010370 T _start
000000000001041c T add
0000000000012038 b completed.3093
0000000000012000 W data_start
00000000000103a6 t deregister_tm_clones
0000000000010418 t frame_dummy
0000000000010428 T main
                 U printf@@GLIBC_2.26
00000000000103ca t register_tm_clones

$ riscv64-unknown-linux-gnu-nm b.out
riscv64-unknown-linux-gnu-nm: b.out: no symbols

那些資訊就是標籤表中的資料格式化之後的結果。因為這是可執行檔的緣故,第一欄的十六進位數字就是這些標籤所在的位址;第二欄的字母則有該標籤所在區段的意思,比方說 t 或是 T,就代表位在 .text 區段中,也就是程式的意思、B 則代表是為初始化資料區段(.bss)等。第三個就是標籤本身

也就是說,strip 的效果正如我們宣稱的那樣,消除了 .symtab 區段,使之無法使用對照表。

小結


最近實在是有點吃緊,先以介紹的方式帶過,等到稍有喘息空檔,再將實作成果公開解析出來。請各位讀者多多海涵!


上一篇
第十七日:strip 原理介紹
下一篇
第十九日:nm 工具程式實作
系列文
與妖精共舞:在 RISC-V 架構上使用 GO 語言實作 binutils 工具包30

尚未有邦友留言

立即登入留言