日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

UNIX 目標(biāo)文件初探( 二 )


文件格式
C 編譯器的正常輸出是用于您所指定的目標(biāo)處理器的匯編代碼 。匯編代碼是匯編器的輸入,在缺省情況下,匯編器將生成所有目標(biāo)文件的祖先,即 a.out 文件 。這個(gè)名稱本身表示匯編輸出 (Assembler Output) 。要?jiǎng)?chuàng)建 a.out 文件,可以在 xterm 窗口中輸入下面的命令:
cc hw.c
注意:如果出現(xiàn)了任何錯(cuò)誤或者沒(méi)有創(chuàng)建 a.out 文件,那么您可能需要檢查自己的系統(tǒng)或源文件 (hw.c),以找出其中的錯(cuò)誤 。還需要檢查是否已將 cc 定義為運(yùn)行您的 C/C編譯器 。
最新的 C 編譯器將編譯和匯編步驟組合成一個(gè)步驟 。您可以指定不同開關(guān)選項(xiàng)以查看 C 編譯器的匯編輸出 。通過(guò)輸入下面的命令,您可以看到 C 編譯器的匯編輸出:
cc -S hw.c
這個(gè)命令生成了一個(gè)新的文件 hw.s,其中包含您通常無(wú)法看到的匯編輸入文本,因?yàn)榫幾g器在缺省情況下將生成 a.out 文件 。正如所預(yù)期的,Unix 匯編程序可以對(duì)這種輸入文件進(jìn)行匯編,以生成 a.out 文件 。
UNIX 特定的工具
假定編譯過(guò)程一切順利,那么在該目錄中就有了一個(gè) a.out 文件,下面讓我們來(lái)對(duì)其進(jìn)行研究 。有許多可用于研究目標(biāo)文件的有價(jià)值的工具,下面便是其中一組:
nm:列出目標(biāo)文件中的符號(hào) 。objdump:顯示目標(biāo)文件中的詳細(xì)信息 。readelf:顯示關(guān)于 ELF 目標(biāo)文件的信息 。列表中的第一個(gè)工具是 nm,它可以列出目標(biāo)文件中的符號(hào) 。如果您輸入 nm 命令,您將注意到在缺省情況下,它會(huì)尋找一個(gè)名為 a.out 的文件 。如果沒(méi)有找到該文件,這個(gè)工具會(huì)給出相應(yīng)的提示 。然而,如果該工具找到了編譯器創(chuàng)建的 a.out 文件,它將顯示類似清單 2 的清單 。
清單 2. nm 命令的輸出08049594 A __bss_start
080482e4 t call_gmon_start
08049594 b completed.4463
08049498 d __CTOR_END__
08049494 d __CTOR_LIST__
08049588 D __data_start
08049588 W data_start
0804842c t __do_global_ctors_aux
0804830c t __do_global_dtors_aux
0804958c D __dso_handle
080494a0 d __DTOR_END__
0804949c d __DTOR_LIST__
080494a8 d _DYNAMIC
08049594 A _edata
08049598 A _end
08048458 T _fini
08049494 a __fini_array_end
08049494 a __fini_array_start
08048478 R _fp_hw
0804833b t frame_dummy
08048490 r __FRAME_END__
08049574 d _GLOBAL_OFFSET_TABLE_
w __gmon_start__
08048308 T __i686.get_pc_thunk.bx
08048278 T _init
08049494 a __init_array_end
08049494 a __init_array_start
0804847c R _IO_stdin_used
080494a4 d __JCR_END__
080494a4 d __JCR_LIST__
w _Jv_RegisterClasses
080483e1 T __libc_csu_fini
08048390 T __libc_csu_init
U __libc_start_main@@GLIBC_2.0
08048360 T main
08049590 d p.4462
U puts@@GLIBC_2.0
080482c0 T _start
這些包含可執(zhí)行代碼的段稱為正文段 。同樣地,數(shù)據(jù)段包含了不可執(zhí)行的信息或數(shù)據(jù) 。另一種類型的段,稱為 BSS 段,它包含以符號(hào)數(shù)據(jù)開頭的塊 。
對(duì)于 nm 命令列出的每個(gè)符號(hào),它們的值使用十六進(jìn)制來(lái)表示(缺省行為),并且在該符號(hào)前面加上了一個(gè)表示符號(hào)類型的編碼字符 。常見的各種編碼包括:A 表示絕對(duì) (absolute),這意味著不能將該值更改為其他的連接;B 表示 BSS 段中的符號(hào);而 C 表示引用未初始化的數(shù)據(jù)的一般符號(hào) 。
可以將目標(biāo)文件中所包含的不同的部分劃分為段 。段可以包含可執(zhí)行代碼、符號(hào)名稱、初始數(shù)據(jù)值和許多其他類型的數(shù)據(jù) 。有關(guān)這些類型的數(shù)據(jù)的詳細(xì)信息,可以閱讀 Unix 中 nm 的 man 頁(yè)面,其中按照該命令輸出中的字符編碼分別對(duì)每種類型進(jìn)行了描述 。
細(xì)節(jié),細(xì)節(jié)…
在目標(biāo)文件階段,即使是一個(gè)簡(jiǎn)單的 Hello World 程序,其中也包含了大量的細(xì)節(jié)信息 。nm 程序可用于列舉符號(hào)及其類型和值,但是,要更仔細(xì)地研究目標(biāo)文件中這些命名段的內(nèi)容,需要使用功能更強(qiáng)大的工具 。

推薦閱讀