有没有办法在不同的程序头中映射.rodata段?

时间:2017-02-27 22:59:58

标签: linux linker ld

在共享库(linux x86_64)的readelf --segments输出中,前几个程序头是:

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000984 0x0000000000000984  R E    200000
  LOAD           0x0000000000000dc8 0x0000000000200dc8 0x0000000000200dc8
                 0x0000000000000280 0x0000000000000288  RW     200000
  DYNAMIC        0x0000000000000de8 0x0000000000200de8 0x0000000000200de8
                 0x00000000000001d0 0x00000000000001d0  RW     8

这些映射了以下各个部分:

Segment Sections...
   00     .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
   01     .init_array .fini_array .jcr .data.rel.ro .dynamic .got .got.plt .data .bss
   02     .dynamic

我正在使用gnu链接器(binutils ld.bfd),并希望了解黑魔法咒语以执行以下任一操作:

  1. 创建一个额外的(R模式)LOAD程序标题来保存 .rodata部分,以便我可以.data.bss.rodata 彼此靠近(而默认链接布局放置我的.rodata 距离.data}
  2. 的距离为0x200000字节
  3. .rodata部分内容与.data.bss放在RW中 (第二)负荷部分。

1 个答案:

答案 0 :(得分:1)

了解如何操作2.首先转储默认链接描述文件,将-Wl,-verbose传递给编译器驱动程序链接步骤,然后通过删除行来修改它:

.rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
.rodata1        : { *(.rodata1) }

并将其添加回.data部分:

.data           :
{
  *(.data .data.* .gnu.linkonce.d.*)
  *(.rodata .rodata.* .gnu.linkonce.r.*)
  *(.rodata1)
  SORT(CONSTRUCTORS)
}

修改后的链接描述文件可与-Wl,-T,pathToThatScript

一起使用