3

我有一个包含具有ref属性的函数的模块。这会将.text放在不同的部分。ARM 堆栈帧展开的工作方式是将两个附加部分放置在ELF文件中。这些部分为 ARM unwind.c提供了表格。module.c文件在加载模块填充这些表。

使用该.ref.text部分时,这两个部分由 gcc-4.7 创建,以允许展开此代码.ARM.extab.ref.text.ARM.exidx.ref.text不幸的是,module.c只扫描.init,.devinit等,并没有添加这些部分。如果我们打开CONFIG_DEBUG_KMEMLEAK,并且__ref在分配期间有一个框架处于活动状态,则堆栈跟踪代码会在内核日志中提供许多unwind: Index not found消息。

  1. __ref在模块 中使用是错误的吗?
  2. 是否应该通过ARM 的架构链接器文件将.ref extabexidx放在核心.ARM.extab.ARM.exidx部分中?
  3. 为什么只有我一个看到这个?我有2.6.36,但问题似乎存在于主线。
4

1 回答 1

1

68kia64都有额外的链接器文件,ia64符合 ARM__ref要求。

将以下内容添加到arch/arm/Makefile

# Glob 'ref' unwind tables.
KBUILD_LDFLAGS_MODULE += -T $(srctree)/arch/arm/module.lds

arch/arm/modules.lds一样,

SECTIONS {
    /DISCARD/ : {
        *(.ARM.exidx.exit.text)
        *(.ARM.extab.exit.text)
        *(.ARM.exidx.devexit.text)
        *(.ARM.extab.devexit.text)
    }
    /* Group unwind sections together: */
    .ARM.extab : { *(.ARM.extab*) }
    .ARM.exidx : { *(.ARM.exidx*) }
    .text : { *(.text); *(.ref.text); *(.rodata*); }
}

会将__ref注释展开信息与正常展开代码放在一起。

这可能会解决多个展开:在 ARM Linux 上使用模块时索引未找到内核日志消息。较新的module.c不需要该部分,因为它支持模块展开信息;但它对 2.6.36 很有用,因为此信息较新使用。/DISCARD/.exit

这可能会导致其他问题,并且尚未通过 ARM Linux 邮件列表来审查问题。

于 2013-07-02T17:34:31.713 回答