链接的ELF二进制文件可以包含多个.text。*段(自动)

链接的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脚本进行管理。

+1

您是否尝试在'.text'之一中添加'.text.whatever'节的定义_before_。 – rodrigo

+0

是的,我已经试过了,所以我编辑了这个问题。谢谢:) –

关于避免自定义链接脚本,我不认为这是可能的。如果你想捣鼓部分,你需要一个链接脚本。

在我的机器,命令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。*部分