我有一个包含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
帧处于活动状态,则堆栈跟踪代码会在内核日志中提供许多展开:未找到索引消息
__ref
是不是错了? .ref
extab 和 exidx .ARM.extab 和 .ARM.exidx 部分?答案 0 :(得分:1)
68k和ia64都有其他链接器文件, 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邮件列表来审核问题。