在c linker中 *(.text)和 *(.text*)有什么区别?

ssgvzors  于 2023-01-04  发布在  其他
关注(0)|答案(1)|浏览(643)

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

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

请注意,这存在于其他像.bss,.rodata等,他们是什么?我知道。文本是代码,.dada初始化变量...和 * 是通配符。我可以看到在arm-none-eabi-objdump函数的形式是.text* 格式,但我没有找到参考来解释他们。

o8x7eapl

o8x7eapl1#

  1. *(.text)将仅包括存储在.text段中的对象。
  2. *(.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

段名称是实现定义的,但非常常见的名称是:

  • .text-代码
  • .rodata-R只读O数据
  • .data-初始化静态存储数据
  • .bss-未初始化静态存储数据

相关问题