我刪除冗餘包括iostream
讓你的源實際上編譯C和彙編它在我的系統上的可執行文件名爲vypis。以下是我發現:
$ nm vypis | fgrep vypis
00000000004004d0 T vypis
0000000000600888 D vypis_ptr
所以,vypis
,一個功能,就是「文本」部分,vypis_ptr
在全球,指向一個功能,就是「數據」部分中的一個全球性的。
數據部分中的對象具有存儲在可執行文件中的值,我可以通過將objdump
中的數據部分傾出來讀取vypis_ptr
中的內容。
$ objdump -d -j .data vypis
vypis: file format elf64-x86-64
Disassembly of section .data:
0000000000600878 <__data_start>:
...
0000000000600880 <__dso_handle>:
...
0000000000600888 <vypis_ptr>:
600888: d0 04 40 00 00 00 00 00 [email protected]
0000000000600890 <bla>:
600890: a8 08 60 00 00 00 00 00 ..`.....
在這裏我們可以看到,值4004d0
存儲在vypis_ptr
,但這是完全一樣的顯示在nm
輸出vypis
位置。
你確定編譯器在困擾這些嗎?主要沒有任何東西,所以它沒有任何關係,所以它不需要包含任何有問題的代碼。 – 2013-03-10 11:01:14
@PhilH,肯定它必須,vypis_ptr是一個外在的可見對象。 – 2013-03-10 11:02:03
這種地址解析不一定是由編譯器完成的,而是由加載器完成的。在程序啓動之前完成的唯一重要的事情。此外,至少在理論上這些事情對於C和C++來說是不同的。在C++中,這甚至可以是一個構造函數,它會在程序啓動之後但在進入'main'之前運行。 – 2013-03-10 11:03:29