2012-03-07 37 views
1

Linux中是否有工具將可執行文件中的不同變量映射到相應的內存段。將可執行文件中的變量映射到內存段

例如,如果我在我的可執行文件中有一個初始化的全局變量int x = 10,該工具應該顯示該變量屬於.data段的可執行文件,其格式類似於下面顯示的格式。

x .data

+0

你爲什麼這麼問?爲什麼這對你很重要?你可以使用'nm'和'objdump'(也許寫一些'awk'來組合它們的輸出)。 – 2012-03-07 06:18:32

+0

@BasileStarynkevitch:在'objdump'中是否有一個選項顯示我想要的輸出? – 2012-03-07 06:27:58

+0

不是你的格式,但'objdump -t -h'可能很有用(可能與'nm'的輸出結合)。但你真的應該解釋你爲什麼要這樣做。將全局變成'.bss'或者變成'.data'是恕我直言的一個建築鏈的實現細節。 – 2012-03-07 06:34:59

回答

1

如果你的可執行文件是剝離,那麼nm command(見Linux manpage for nm)會做你想要的東西 - 它打印符號名稱/地址/類型的表。它有多個輸出選項;在Linux上,「sysv」風格的格式接近於給你你想要的東西。示例:

$ nm -f sysv /bin/perl

Symbols from /bin/perl:

Name Value Class Type Size Line Section

Bases.3 |000000000813019c| d | OBJECT|0000000000000014| |.data F0convert |00000000080c6905| t | FUNC|00000000000000c6| |.text PL_AMG_names |0000000008137c80| D | OBJECT|0000000000000108| |.data PL_No |0000000008137904| D | OBJECT|0000000000000004| |.data PL_Yes |0000000008137900| D | OBJECT|0000000000000004| |.data [ ... ] PL_curinterp |0000000008138e88| B | OBJECT|0000000000000004| |.bss PL_do_undump |0000000008137910| D | OBJECT|0000000000000001| |.data PL_dollarzero_mutex |0000000008138e58| B | OBJECT|0000000000000018| |.bss PL_fold |000000000812c020| R | OBJECT|0000000000000100| |.rodata PL_fold_locale |0000000008135c80| D | OBJECT|0000000000000100| |.data PL_force_link_funcs |0000000008137da0| D | OBJECT|00000000000006c8| |.data PL_freq |000000000812c120| R | OBJECT|0000000000000100| |.rodata PL_hexdigit |0000000008137908| D | OBJECT|0000000000000004| |.data PL_memory_wrap |000000000812bfa3| R | OBJECT|0000000000000013| |.rodata [ ... ] PerlIO_setpos |0000000008112134| T | FUNC|00000000000000a6| |.text PerlIO_sprintf |00000000081122ee| T | FUNC|000000000000002a| |.text PerlIO_stdio |0000000008138720| D | OBJECT|0000000000000070| |.data PerlIO_stdoutf |0000000008112066| T | FUNC|000000000000003b| |.text [ ... ]

如果創建了從C源代碼的目標文件:

int x = 10;

和運行,通過nm,它提供了:

$ nm -f sysv xxxx.o 


Symbols from xxxx.o: 

Name   Value   Class  Type   Size  Line Section 

x   |0000000000000000| D | OBJECT|0000000000000004|  |.data 

注意Value場由它報道的是地址所述符號的,而不是變量的內容。

如果您在其上運行strip,此表會被刪除,但所有nm都告訴您「沒有符號」。

+0

完美!這是我想要的 – 2012-03-08 04:58:13