我删除冗余包括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