模块可以在ARM上使用“ref”部分吗?

时间:2013-06-28 22:00:06

标签: linux-kernel arm

我有一个包含ref属性函数的模块。这会将.text放在不同的部分中。 ARM stack frame unwinding的工作方式是将另外两个部分放在 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帧处于活动状态,则堆栈跟踪代码会在内核日志中提供许多展开:未找到索引消息

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

1 个答案:

答案 0 :(得分: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 as,

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上使用 modules 时,这可以解决多个展开:未找到索引内核日志消息。新版module.c不需要/DISCARD/部分,因为它支持模块.exit展开信息;但它对2.6.36很有用,因为这些信息是新用的。

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