我想知道两者之间的确切区别:
*(.text) /* .text sections (code) */ *(.text*) /* .text* sections (code) */
请注意,这存在于其他像.bss,.rodata等,他们是什么?我知道。文本是代码,.dada初始化变量...和 * 是通配符。我可以看到在arm-none-eabi-objdump函数的形式是.text* 格式,但我没有找到参考来解释他们。
o8x7eapl1#
*(.text)
.text
*(.text*)
baseShouldLoadMeshGUI
.text.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
段名称是实现定义的,但非常常见的名称是:
.rodata
.data
.bss
1条答案
按热度按时间o8x7eapl1#
*(.text)
将仅包括存储在.text
段中的对象。*(.text*)
将仅包括存储在名称开头为.text
的段中的对象(* 的作用类似于通配符)。如果编译器将函数放在自己的节中以删除未使用的函数,则这一点尤为重要。
如果进行编译,要求编译器将函数放置在单独的节中,则您将获得例如包含***
baseShouldLoadMeshGUI
函数的.text.baseShouldLoadMeshGUI
***节。如果您想丢弃未使用的函数,则需要使用该函数,因为
ld
链接器只能丢弃节,而不能丢弃节中的特定函数。示例:
段名称是实现定义的,但非常常见的名称是:
.text
-代码.rodata
-R只读O数据.data
-初始化静态存储数据.bss
-未初始化静态存储数据