1
25
使用这些编译器选项时,可以添加链接器选项
|
2
30
有趣的是,使用
如果对象文件中的所有BSS(或数据)项都分配给单个节,那么编译器可以将该节的地址存储在函数文字池中,并生成与函数中该地址具有已知偏移量的加载以访问数据。但是如果你能
所以是的,即使
下面我添加了一个最小的示例 下面的代码足以看到我所说的行为。请不要被volatile声明和全局变量的使用所抛弃,这两者在实际代码中都是有问题的。在这里,它们确保在使用-fdata节时创建两个数据节。
用于此测试的GCC版本为:
首先,如果没有-fdata部分,我们将得到以下结果。
从
接下来我们将看到添加-fdata节时会发生什么。
我们立即看到queue_empty的长度增加了4个字节,达到24个字节(18个十六进制),现在queue_empty的文本池中有两个重定位要完成。这些重新定位对应于创建的两个BSS节的地址,每个BSS节对应一个全局变量。这里需要有两个地址,因为编译器无法知道链接器最后将这两个部分放入的相对位置。看一下queue_empty开头的指令,我们发现有一个额外的加载,编译器必须生成单独的加载对,以获取节的地址,然后获取该节中变量的值。这个版本的queue_empty中的额外指令不会使函数体变长,它只是占用了以前是nop的位置,但一般情况下不会这样。 |
3
13
你可以用
然后使用
因此,最终的二进制数将小于没有这些标志的t。
尽管如此,还是要小心
|
4
4
我得到了更好的结果添加一个额外的步骤并构建一个
|
5
0
我试了一会儿,看看结果,似乎大小的增加来自于不同排列的对象的顺序。正常情况下,链接器对对象进行排序以保持它们之间的填充很小,但看起来这只在一个部分内有效,而不是在各个部分之间有效。因此,经常会在每个函数的数据段之间获得额外的填充,从而增加总体空间。 对于带有-Wl,-gc段的静态lib,删除未使用的段很可能会弥补较小的增加。 |
Darky · 多重定义…c++vsCode[重复] 2 年前 |
Ty Q. · 分段故障GLFW3/GLAD 2 年前 |
Noè Murr · 如何获得C函数的基本编译二进制代码? 2 年前 |
AvirukBasak · gcc中无return语句的尾部递归 2 年前 |
hepl · gcc如何决定在创建可执行文件时使用dynamics库? 2 年前 |