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