为什么有多个.rodata节被映射到LOAD段,但链接器脚本中只指定了一个.rodata输出节?

时间:2017-12-20 00:25:46

标签: linux gnu elf linker-scripts

这是我的链接描述文件:

ENTRY(__startup)
SECTIONS
{
   . = 0x0000;
   .text : { *(.text) }
   . = . + 0x4000;
   .rodata : 
   { 
     *(.rodata) 
     *(.rodata.*) 
   }
   .bss : { *(.bss) }
   .data : { *(.data) }
}

简单够了。但是,当所有目标文件链接在一起并且我查看可执行文件的段映射时,我得到以下内容:

Elf file type is EXEC (Executable file)
Entry point 0x0
There are 6 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0xfffff034 0xfffff034 0x000c0 0x000c0 R   0x4
  LOAD           0x000000 0xfffff000 0xfffff000 0x000f4 0x000f4 R   0x1000
  LOAD           0x001000 0x00000000 0x00000000 0x01a18 0x01a18 R E 0x1000
  LOAD           0x002a18 0x00005a18 0x00005a18 0x00038 0x00038 R   0x1000
  LOAD           0x002a50 0x00005a50 0x00005a50 0x0010c 0x0010c RW  0x1000
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0

 Section to Segment mapping:
  Segment Sections...
   00     
   01     
   02     .text 
   03     .rodata .rodata 
   04     .bss .bss .data 
   05     

对程序执行objdump还会显示两个.rodata部分。我正在运行的系统是ubuntu 16.0.4,我的编译器是gcc(我正在使用LD,GNU链接器)。

是否有人知道编译生成两个同名输出节的原因?有没有办法强迫它呢?这完全有可能这不仅仅是关于命令语言脚本的一般性问题,但由于我无法展示我正在使用的代码库,我仍然认为在Stack Overflow上问好人是不会有害的。

1 个答案:

答案 0 :(得分:1)

似乎LD链接器的默认行为是根据存储在只读存储器中的常量所需的任何对齐来分配不同的.rodata节。有关更多信息,请参阅此处:

what does `.rodata.str1.8` section mean in elf file