使用链接时间优化时强制GCC保留节

使用链接时间优化时强制GCC保留节,gcc,sections,lto,Gcc,Sections,Lto,我有一个Cstruct,它由GCC编译成一个特殊的部分,并通过链接器脚本放在输出二进制文件的开头。它包含文件元数据,开头包含一个神奇的值 下面是一个简化的示例,只使用字符串作为结构 const char\uuuu magic\u value[9]\uuuuu属性(section(“.the\u header”))=“MAGICVAL”; GCC将此值放入自己的部分,正如我们在readelf-S中看到的那样: 共有10个节头,从偏移量0x190开始: 章节标题: [Nr]名称类型地址尺寸ES F

我有一个C
struct
,它由GCC编译成一个特殊的部分,并通过链接器脚本放在输出二进制文件的开头。它包含文件元数据,开头包含一个神奇的值

下面是一个简化的示例,只使用字符串作为结构

const char\uuuu magic\u value[9]\uuuuu属性(section(“.the\u header”))=“MAGICVAL”;
GCC将此值放入自己的部分,正如我们在
readelf-S
中看到的那样:

共有10个节头,从偏移量0x190开始:
章节标题:
[Nr]名称类型地址尺寸ES Flg Lk Inf Al
[0]空0000000000000000000
[1].文本程序00000000 000034 00000000 AX 0 0 2
[2].数据程序00000000 000034 00000000 WA 0 1
[3].bss NOBITS 00000000 000034 00000000 WA 0 1
[4]。_头程序位00000000 000034 000009 00 A 0 0 1
[5].注释程序00000000 00003d 00001e 01 MS 0 1
[6].ARM.attributes ARM_attributes 00000000 00005b 000033 00 0 1
[7].shstrtab STRTAB 00000000 00008e 000051 00 0 1
[8].symtab symtab 00000000 0000e0 000090 10 9 8 4
[9].strtab strtab 00000000 000170 00001e 00 0 1
标志的关键点:
W(写入)、A(分配)、X(执行)、M(合并)、S(字符串)
I(信息)、L(链接顺序)、G(组)、T(TLS)、E(排除)、x(未知)
O(需要额外的操作系统处理)O(特定于操作系统),p(特定于处理器)
(注意第4节。)

现在,如果我为GCC调用指定
-flto
,则不再发出此部分

共有19个节头,从偏移量0x730开始:
章节标题:
[Nr]名称类型地址尺寸ES Flg Lk Inf Al
[0]空0000000000000000000
[1].文本程序00000000 000034 00000000 AX 0 0 2
[2].数据程序00000000 000034 00000000 WA 0 1
[3].bss NOBITS 00000000 000034 00000000 WA 0 1
[4].gnu.lto_U2;.profile程序位00000000 000034 00000f 00 E 0 1
[5].gnu.lto_u2;icf.93e程序00000000 000043 000017 00 E 0 0 1
[6].gnu.lto_u2;jmpfunc程序位00000000 00005a 00000 f 00 E 0 1
[7].gnu.lto_u.inline。程序位00000000 000069 00000f 00 E 0 0 1
[8].gnu.lto_u0;purecon程序位00000000 000078 00000 f 00 E 0 1
[9].gnu.lto_uu0.symbol_u0.PROGBITS 00000000 000087 000022 00 E 0 0 1
[10] .gnu.lto_u.refs.93程序00000000 0000a9 00000f 00 E 0 0 1
[11] .gnu.lto_.decls.9程序位00000000 0000b8 000239 00 E 0 0 1
[12] .gnu.lto_uu.symtab。程序位00000000 0002f1 00001d 00 E 0 1
[13] .gnu.lto_u2;选择程序00000000 00030e 0000e8 00 E 0 1
[14] .注释程序00000000 0003f6 00001e 01 MS 0 1
[15] .ARM.attributes ARM_属性00000000 000414 000033 00 0 0 1
[16] .shstrtab STRTAB 00000000 000447 00018c 00 0 1
[17] .symtab symtab 00000000 0005d4 000130 10 18 17 4
[18] .strtab strtab 00000000 000704 00002c 00 0 1
标志的关键点:
W(写入)、A(分配)、X(执行)、M(合并)、S(字符串)
I(信息)、L(链接顺序)、G(组)、T(TLS)、E(排除)、x(未知)
O(需要额外的操作系统处理)O(特定于操作系统),p(特定于处理器)
我的链接器脚本找不到
。\u头
部分,导致二进制文件损坏

我已经尝试为header变量指定
\uuuuu属性(used))
,但没有效果

以下是链接器脚本的相关部分:

ENTRY(main)

MEMORY
{
  APP (rwx) : ORIGIN = 0, LENGTH = 65536
}

SECTIONS
{
    .header :
    {
        KEEP(*(.the_header))

    } > APP

    ...
}

当使用链接时间优化和上述链接器脚本片段时,我如何告诉GCC将
。头
发送到最终二进制文件中?

向GCC报告错误?事实上,它对我很有效,我确实得到了一个部分。即使使用LTO,最终二进制文件中的_头。。。(显然,我在.o文件中没有得到一个)或者我可以在.o文件中得到带有
-ffat-lto对象的部分,但是这种方式有点违背了lto的观点。嗯,你是对的,
-ffat-lto对象
确实发出一个
。\u头
部分。也许这与链接器脚本有关。。。我已经添加了相关的部分。即使是胖对象,也无法发射截面,这与此有关吗?看起来你将不得不在没有LTO的情况下编译程序的这一部分…啊,这太不幸了。谢谢你的链接。如果你想把它转换成答案,我会把它标记为已接受!向gcc报告错误?事实上,它对我很有效,我确实得到了一个部分。即使使用LTO,最终二进制文件中的_头。。。(显然,我在.o文件中没有得到一个)或者我可以在.o文件中得到带有
-ffat-lto对象的部分,但是这种方式有点违背了lto的观点。嗯,你是对的,
-ffat-lto对象
确实发出一个
。\u头
部分。也许这与链接器脚本有关。。。我已经添加了相关的部分。即使是胖对象,也无法发射截面,这与此有关吗?看起来你将不得不在没有LTO的情况下编译程序的这一部分…啊,这太不幸了。谢谢你的链接。如果你想把它转换成答案,我会把它标记为已接受!