c - 将.data发送到其他部分

时间:2015-02-11 00:17:35

标签: gcc linker-scripts

我想获取为特定C文件生成的.data部分中的符号,并将它们放在最终可执行文件的不同部分(例如.mydata)中。例如,

normaldata.c:  char * my_str = "this should appear in .data";
specialdata.c: char * my_special_str = "this should appear in .mydata";

默认情况下,my_strmy_special_str都显示在.data部分。但是,当我生成specialdata.o时,我想将.data中出现的任何内容发送给.mydata

我知道我可以使用__attribute__((section(".mydata")))来实现这种效果,但我不知道如何将它应用于结构的指针成员的指定初始化器(我简化了我的代码这个问题)。所以相反,我想也许我可以使用链接描述文件并将特定文件中的所有数据发送到我的特殊部分。

我尝试了这个链接描述文件(link.lds):

SECTIONS
{
    .mydata : { *(.data) }
}

gcc -c specialdata.c -T link.lds -o specialdata.o,但objdump -x specialdata.o的输出显示.data部分,但没有.mydata部分。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

在C声明中,section()属性指定链接器的输入节名称。在链接描述文件的.mydata部分中指定的SECTIONS名称是输出部分的名称。在.mydata中,您告诉链接器将“*(.data)”输入节中的所有符号放入.mydata输出节,但您的C属性使用输出节的名称。

要使链接器将C变量放在正确的输出节中,必须在.mydata输出节定义和C section()属性中对输入节使用相同的名称。 / p>

尝试更改输入节的名称,并在链接描述文件和C属性中使用相同的名称。

链接器脚本:

SECTIONS
{
    /* Put all symbols from the .my_data input section into the
     * .mydata output section.
     */
    .mydata : { *(.my_data) }
}

specialdata.c来源:

// Note that the input section name is ".my_data", not ".mydata".
char * my_special_str __attribute__((section(".my_data"))) =
    "this should appear in .mydata";