我想知道两者之间的确切区别:
*(.text) /* .text sections (code) */
*(.text*) /* .text* sections (code) */
请注意,这存在于其他像.bss, .rodata .etc,他们呢?我知道。text是代码,。data初始化变量…我可以在arm-none-eabi-objdump中看到函数是。text*格式的,但我没有找到确切解释它们的参考。
*(.text)
将只包含存储在.text
段中的对象。*(.text*)
将只包括存储在以.text
开头的段中的对象(*像通配符一样工作)。
如果编译器将函数放在自己的节中以删除不使用的函数,这一点尤为重要。
如果你编译,要求编译器把函数放在单独的部分,你会有例如.text.baseShouldLoadMeshGUI
baseShouldLoadMeshGUI
函数。如果您想丢弃未使用的函数,则需要这样做,因为ld
链接器只能丢弃部分,而不能丢弃部分中的特定函数。
的例子:
.text.baseShouldLoadUpMesh
0x0000000000000000 0x4 ./Apps/G4-MC3/baseG4MC3.o
.text.baseShouldLoadMeshGUI
0x0000000000000000 0x4 ./Apps/G4-MC3/baseG4MC3.o
.text.baseTriggerUSBDStart
0x0000000000000000 0x94 ./Apps/G4-MC3/baseG4MC3.o
.text.GUI_ShowNewSkin
0x0000000000000000 0x54 ./Apps/G4-MC3/baseG4MC3.o
更详细的说明:
- function-sections指示gcc将每个函数(包括静态函数)放在它自己的名为.text的节中。Function_name而不是将所有函数放在一个大的。text节中。在链接时,ld通常将所有这些部分合并为一个输出再次Section .text。它是通过使用*(.text.*)规范实现的在内置链接器脚本中使用*(.text)规范
-fdata-sections是类似的:它将每个全局或静态变量放入.data中。variable_name .rodata。. Variable_name或.bss. Variable_name
段名称是由实现定义的,但是最常用的名称是:
.text
- code.rodata
-rOO只有数据.data
-初始化静态存储数据.bss
-未初始化静态存储数据