我想把其中的符号.data
为特定 C 文件生成的节并将它们放在不同的节中(例如.mydata
)在最终的可执行文件中。例如,
normaldata.c: char * my_str = "this should appear in .data";
specialdata.c: char * my_special_str = "this should appear in .mydata";
默认情况下,两者my_str
and my_special_str
出现在.data
部分。但是,当我生成specialdata.o
,我想发送任何会出现在.data
相反.mydata
.
我知道我可以使用__attribute__((section(".mydata")))
来实现这种效果,但我不知道如何将其应用于结构体指针成员的指定初始值设定项(我已经简化了这个问题的代码)。因此,我想也许我可以使用链接器脚本并将特定文件中的所有数据发送到我的特殊部分。
我尝试了这个链接器脚本(link.lds
):
SECTIONS
{
.mydata : { *(.data) }
}
with gcc -c specialdata.c -T link.lds -o specialdata.o
,但输出objdump -x specialdata.o
显示了一个.data
部分但没有.mydata
部分。
我究竟做错了什么?
在你的 C 声明中,section()
属性指定链接器的输入节名称。这.mydata
名称,指定在SECTIONS
链接器脚本的一部分是一个名称output部分。在.mydata
您告诉链接器放置“中的所有符号*(.data)
” 将部分输入到.mydata
输出节,但您的 C 属性使用输出节的名称。
要让链接器将 C 变量放置在正确的输出节中,必须在两个链接器中的输入节中使用相同的名称。.mydata
输出节定义和Csection()
属性。
尝试更改输入节的名称并在链接器脚本和 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";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)