将前缀更改为-ffunction-sections生成的按功能的部分

时间:2019-07-10 02:59:55

标签: gcc

如果我有一个函数foo()并使用-ffunction-sections,则gcc会将foo()放在其自己的.text.foo部分中。是否可以更改.text的前缀?这样我得到.customName.foo而不是text.foo

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我使用 section 属性解决了它。

以下解决方案是最简单的,但不会为每个函数创建一个部分(如 -ffunction-section 参数允许的那样)

#define AT_FLASH_TEXT_SECTION(var) \
    __attribute__((section(".text.flash"))) var

AT_FLASH_TEXT_SECTION(int myFunction(float param1, long param2));

因此函数 myFunction 将出现在部分 .text.flash 中,但也会出现使用宏 AT_FLASH_TEXT_SECTION 声明的所有其他函数。



为了获得所需的行为,我对宏进行了如下修改:

#define AT_FLASH_TEXT_SECTION_SYM(var, subsectionName) \
    __attribute__((section(".text.flash." #subsectionName))) var

AT_FLASH_TEXT_SECTION_SYM(int myNewFunction(float param1, long param2), myNewFunction);

这是我目前找到的最好的解决方案。
不幸的是,它容易出错:函数名称必须在 subsectionName 宏的 AT_FLASH_TEXT_SECTION_SYM 参数中重复相同。
此外,如果两个 c 模块包含两个同名的静态函数,它们将在同一部分发出,回到上一个问题。

我希望这会有所帮助,也许您可​​以从中找到更好的解决方案。

答案 1 :(得分:0)

不,这似乎不可能。请参阅return view('posts.show', compact('post')); (我尚未运行调试器,但可以肯定的是这是计算节名称的代码。)

gcc/varasm.c

此外,这可能不是一个好主意,例如链接描述文件根据节的名称来对待节(请参见void default_unique_section (tree decl, int reloc) { [...] switch (categorize_decl_for_section (decl, reloc)) { case SECCAT_TEXT: prefix = one_only ? ".t" : ".text"; break; [...] name = IDENTIFIER_POINTER (id); name = targetm.strip_name_encoding (name); [...] string = ACONCAT ((linkonce, prefix, ".", name, NULL)); set_decl_section_name (decl, string); } )。像ld --verbose之类的东西可能是更好的选择,但我不知道您为什么要自定义首选项。


作为解决方法,您可以使用section属性手动分配部分。

.text.customprefix.foo