一个模块在ARM上能否使用'ref'部分?

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,但这个问题似乎存在于主线中。
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上使用模块时出现多个unwind: Index not found内核日志消息的问题。对于支持模块.exit展开信息的新module.c,不需要/DISCARD/部分;但对于2.6.36版本,这些信息是较新的,因此它是有用的。

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


+1 不错的研究。在将其用于实验之外的更多场合前,最好先向相关人士咨询一下意见。 - Chris Stratton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接