1

我正在编写一个 Linux 内核模块,我想在同一部分中包含一些代码和相关数据。我用属性标签声明数据和函数,例如:

void * foo __attribute__ ((section ("SEC_A"))) = NULL;
void bar(void)  __attribute__ ((section("SEC_A")));

但是,当我这样做时,gcc 抱怨:

error: foo causes a section type conflict

如果我没有用特定的部分名称声明函数,gcc 就可以了。但我希望函数和变量都在同一部分。

有没有办法用 gcc 做到这一点?我的 gcc 版本是gcc (Ubuntu 4.3.2-1ubuntu12) 4.3.2

4

2 回答 2

1

从 GCC 手册:

某些文件格式不支持任意节,因此节属性并非在所有平台上都可用。如果您需要将模块的全部内容映射到特定部分,请考虑改用链接器的工具。

IIRC,linux使用平面内存模型,所以你不会通过将东西“强制”到一个部分中来获得任何东西,对吧?

嗯。我想您可以创建一个 asm 函数来保留空间,然后执行指针 foo 来获取它的地址。可能想将丑陋的东西包装在宏中......

另一个想法是将问题分成两半;写一个你可以编译的最接近的例子,获取asm代码,然后修改它,看看你可以通过下游阶段得到什么。如果没有别的,你可以写一些东西来混合那个模块的 asm 代码,把它埋在你的 make 文件中,然后称之为好。

另一个想法:尝试将变量定义放在一个小的 asm 模块中(例如,作为 db 或具有正确部分声明的任何内容)并让链接器处理它。

于 2009-03-19T19:50:00.530 回答
0

我认为您不能将文本(函数)和数据(BSS)对象放入同一部分,因为(某些)操作系统假定 .TEXT 部分类型的不变性以供进程重用。

于 2009-03-19T20:30:28.420 回答