Gcc 链接的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

我目前正在试验GNULD链接器脚本

我希望在编译和链接的Linux x64 ELF二进制文件中有多个.text.*节。 我通过

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)
  }