链接的ELF二进制文件可以包含多个.text。*段(自动)
问题描述:
我目前正在试验GNU LD链接器脚本。链接的ELF二进制文件可以包含多个.text。*段(自动)
我想在编译的&链接的Linux x64 ELF二进制文件中有多个.text。*段。 我编译我的示例代码到一个.o目标文件经由
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
<...>
链接这跟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))
}
<...>
(我知道这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))
}
<...>
我有一些部分成功(objdump的-x ./sample |以内):
<...>
11 .text.addPrintNumbers 00000032 0000000000400400 0000000000400400 00000400 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .text.printString 0000001f 0000000000400432 0000000000400432 00000432 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .text 00000112 0000000000400460 0000000000400460 00000460 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
<...>
这两个手动链接部分放在ELF二进制文件中,并且仍然可执行。
是否有可能在编译和链接二进制文件中自动创建所有.text。*段,而无需手动编辑LD脚本。 我正在寻找一个标志,它自动执行,我用手动编辑的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)
}
如果你想改变这种状况,必须更改脚本。没有解决方法!
+0
这的确如此。 –
答
尝试打开优化。以某种方式开启优化,例如-O2标志,指示编译器和链接器不合并.text。*部分
您是否尝试在'.text'之一中添加'.text.whatever'节的定义_before_。 – rodrigo
是的,我已经试过了,所以我编辑了这个问题。谢谢:) –