在c链接器中*(.text)和*(.text*)的区别是什么?



我想知道两者之间的确切区别:

*(.text)           /* .text sections (code) */
*(.text*)          /* .text* sections (code) */

请注意,这存在于其他像.bss, .rodata .etc,他们呢?我知道。text是代码,。data初始化变量…我可以在arm-none-eabi-objdump中看到函数是。text*格式的,但我没有找到确切解释它们的参考。

  1. *(.text)将只包含存储在.text段中的对象。
  2. *(.text*)将只包括存储在以.text开头的段中的对象(*像通配符一样工作)。

如果编译器将函数放在自己的节中以删除不使用的函数,这一点尤为重要。

如果你编译,要求编译器把函数放在单独的部分,你会有例如.text.baseShouldLoadMeshGUIbaseShouldLoadMeshGUI

函数。如果您想丢弃未使用的函数,则需要这样做,因为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-未初始化静态存储数据

最新更新