Gcc 链接的ELF二进制文件能否包含多个.text.*节(自动)
我目前正在试验GNULD链接器脚本 我希望在编译和链接的Linux x64 ELF二进制文件中有多个.text.*节。 我通过Gcc 链接的ELF二进制文件能否包含多个.text.*节(自动),gcc,linker,ld,elf,dynamic-linking,Gcc,Linker,Ld,Elf,Dynamic Linking,我目前正在试验GNULD链接器脚本 我希望在编译和链接的Linux x64 ELF二进制文件中有多个.text.*节。 我通过 gcc -ffunction-sections -fdata-sections -c sample.c 现在每个函数都放在一个单独的.text中。对象文件中的节: <...> 8 .text.main 0000003b 0000000000000000 0000000000000000 00000098 2**0
gcc -ffunction-sections -fdata-sections -c sample.c
现在每个函数都放在一个单独的.text中。对象文件中的节:
<...>
8 .text.main 0000003b 0000000000000000 0000000000000000 00000098 2**0
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
9 .text.printString 0000001f 0000000000000000 0000000000000000 000000d3 2**0
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
10 .text.addPrintNumbers 00000032 0000000000000000 0000000000000000 000000f2 2**0
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
11 .text.getAnotherNumber 0000000b 0000000000000000 0000000000000000 00000124 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
<...>
8.text.main 0000003b 000000000000000000000000000000000000000000000000000000 982**0
内容、ALLOC、LOAD、RELOC、只读、代码
9.text.printString 0000001f 000000000000000000000000000000 D3 2**0
内容、ALLOC、LOAD、RELOC、只读、代码
10.text.addPrintNumbers 000000 32 000000000000000000000000000000000000 F2 2**0
内容、ALLOC、LOAD、RELOC、只读、代码
11.text.getAnotherNumber 0000000 B 000000000000000000000000 1242**0
内容、分配、加载、只读、代码
将其与LD和自定义脚本链接,将导致所有代码合并为ELF二进制文件中的一个单片.text部分。
我尝试了.text.*合并的两个变体:
<...>
.text :
{
KEEP (*(.text .text.*))
KEEP (*(.text.unlikely .text.*_unlikely .text.unlikely.*))
KEEP (*(.text.exit .text.exit.*))
KEEP (*(.text.startup .text.startup.*))
KEEP (*(.text.hot .text.hot.*))
KEEP (*(.stub .gnu.linkonce.t.*))
/* .gnu.warning sections are handled specially by elf32.em. */
KEEP (*(.gnu.warning))
}
<...>
.案文:
{
保留(*.text.text.*)
保留(*.text.unliked.text.*.\u unliked.text.unliked.*)
保留(*.text.exit.text.exit.*)
保留(*.text.startup.text.startup.*)
保持(*.text.hot.text.hot.*))
保留(*.stub.gnu.linkonce.t.*))
/*.gnu。警告部分由elf32.em专门处理*/
保持(*(gnu.警告))
}
(我知道这个KEEP参数只是让LD垃圾收集器在代码中保留此节,而不是将其放在单独的节中
当我尝试这个实验结构时:
<...>
.text.addPrintNumbers :
{
KEEP(*(.text.addPrintNumbers))
}
.text.printString :
{
KEEP(*(.text.printString))
}
.text :
{
KEEP (*(.text .text.*))
KEEP (*(.text.unlikely .text.*_unlikely .text.unlikely.*))
KEEP (*(.text.exit .text.exit.*))
KEEP (*(.text.startup .text.startup.*))
KEEP (*(.text.hot .text.hot.*))
KEEP (*(.stub .gnu.linkonce.t.*))
/* .gnu.warning sections are handled specially by elf32.em. */
KEEP (*(.gnu.warning))
}
<...>
.text.addPrintNumber:
{
保留(*.text.addPrintNumber))
}
.text.printString:
{
保留(*.text.printString))
}
.案文:
{
保留(*.text.text.*)
保留(*.text.unliked.text.*.\u unliked.text.unliked.*)
保留(*.text.exit.text.exit.*)
保留(*.text.startup.text.startup.*)
保持(*.text.hot.text.hot.*))
保留(*.stub.gnu.linkonce.t.*))
/*.gnu。警告部分由elf32.em专门处理*/
保持(*(gnu.警告))
}
我取得了部分成功(objdump-x./sample | less):
11.text.addPrintNumbers 000000 32 0000000000 40040000000000000 40040000000 2**0
内容、分配、加载、只读、代码
12.text.printString 000000 1F 0000000000 400432 0000000000 400432 00000432**0
内容、分配、加载、只读、代码
13.文本00000112 0000000000 4004600000000000 40046000000 460 2**4
内容、分配、加载、只读、代码
这两个手动链接的部分放在ELF二进制文件中,仍然可以执行
是否可以在不使用手动编辑的LD脚本的情况下,将所有.text.*节自动编译并链接到二进制文件中。
我正在寻找一个能自动完成我用手动编辑的LD脚本管理的功能的标志。关于避免自定义链接器脚本,我认为这是不可能的。如果你想处理部分,你需要一个链接器脚本 在我的机器中,命令
ld--verbose
输出:
.text :
{
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
*(.text.exit .text.exit.*)
*(.text.startup .text.startup.*)
*(.text.hot .text.hot.*)
*(.text .stub .text.* .gnu.linkonce.t.*)
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
}
如果要更改,必须更改脚本。没有解决方法!尝试打开优化。以某种方式打开优化,例如-O2标志,指示编译器和链接器不要合并.text..sections是否尝试添加
.text。在.text
之前添加任何节定义?是的,我我已经试过了,所以我编辑了这个问题。谢谢:)事实似乎确实如此。
.text :
{
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
*(.text.exit .text.exit.*)
*(.text.startup .text.startup.*)
*(.text.hot .text.hot.*)
*(.text .stub .text.* .gnu.linkonce.t.*)
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
}