如何在一个部分的末尾放置一个变量(使用GCC)

时间:2013-05-25 16:04:02

标签: c++ gcc g++ ld linker-scripts

我想在其内存部分的末尾放置一个特定的变量。

所以,如果我有:

file1.cpp:

__attribute__((section(".mysection"))) char var1[] = "var1";

和另一个file2.cpp:

__attribute__((section(".mysection"))) char var2[] = "var2";

如何强制var2位于mysection的末尾?

2 个答案:

答案 0 :(得分:3)

好吧,我最后采取了一种完全不同的方法,但我想在这里分享我的最终结论: 我的基础是How to fetch the end address of my code

在代码中,您必须为变量添加 extern 引用:

extern char var2[];

必须按如下方式编写链接描述文件:

SECTIONS
{
    .mysection : {
        *(.mysection);
        var2 = .;
    }
}
INSERT AFTER .mysection

在链接期间添加链接描述文件(例如ld -T <PATH_TO_MY_LINKER_SCRIPT>) 使用INSERT AFTER部分,因此我的链接描述文件将添加到默认链接描述文件中。

我不得不使用'gold'链接我的elf文件,显然我使用的版本不支持'INSERT AFTER'语法。所以实际的解决方案应该是复制默认的链接描述文件,只需添加我的脚本信息即可。

我没有测试过,但我仍然希望它可以帮助别人。

答案 1 :(得分:0)

您必须在链接器命令文件中创建自己的部分,并将您的部分放在链接器命令文件的变量部分中。

对于大多数链接器,您无法告诉它确切变量的顺序。更简单的解决方案是为每个变量创建一个部分,并告诉链接器您希望如何订购部分。

查找GNU编译器集合的链接器命令文件的确切语法。