链接器如何创建可执行文件和链接C关键字

时间:2014-06-16 18:38:52

标签: c gcc compiler-construction linker elf

我在Ubuntu(Linux 2.6)中创建了2个C程序,如下所示

1.c
----
main()
{
}

2.c
----
#include<stdio.h>
main()
{
int a[500];
float f[1000];
double d[100000];
int i = 0;
for(i = 0;i < 10000;i++);  // Intentional ;
for(i = 0;i < 10000;i++);  // Intentional ;
for(i = 0;i < 10000;i++);  // Intentional ;
for(i = 0;i < 10000;i++);  // Intentional ;
if(1)
{
}
else
{
}
switch(1)
{
}
while(1);
}

在单独编译和创建可执行文件之后,我检查了两个可执行文件的大小。令我惊讶的是,两个可执行文件的大小相同(7099字节)。

然而,目标文件的大小不同。

有人请解释一下为什么程序1.c和2.c.Program 2.c的可执行文件大小相同,应该使用更多的空间,可执行文件的大小应该增加吗? 链接器如何链接C关键字(如int,float,while,if ..)并创建可执行文件?

非常感谢

2 个答案:

答案 0 :(得分:1)

我认为这与优化器有关。但是,对于链接器,我建议阅读以下几点,因为你表现出对链接器的好奇心。阅读这些将有助于任何C&amp; C ++程序员。了解链接实际意味着什么是重要的知识。

欲了解更多信息:

注意:这可能不是您所寻找的,但研究和学习您自己寻找的内容将使您学到的内容持续更长时间。

答案 1 :(得分:0)

能够为问题找到令人信服的解决方案。以下是对此的分析和观察。

在代码2.c中,我添加了许多“的语句(i = 0; i&lt; 10000; i ++); // Intentional;”。在某些时候,观察到2.c的可执行文件的大小增加了4096字节。看起来,链接器默认为代码段分配4k内​​存,如PAGE Alignment的链接描述文件中所述。对于x86,此大小为4k(COMMONPAGESIZE)。只有在代码大小超过4k后,才会为代码段分配新的4k内存。这就是为什么当更多“for(i = 0; i&lt; 10000; i ++); // Intentional;”语句被添加时,可执行文件的大小增加了。