2017-02-27 57 views
0

在readelf --segments为一个共享库(Linux的x86_64的)输出,前几个节目标题有:有没有办法将.rodata段映射到不同的程序头文件中?

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 

我使用的:

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 

这些以下各部分映射GNU链接器(binutils的ld.bfd),并想知道魔法咒语做以下任一操作:

  1. 创建一个额外的(R模式)LOAD程序头以保存 .rodata部分,以便我可以将.data,.bss和.rodata全部相互靠近(而默认链接布局会将我的.rodata 〜0x200000字节远离我的.data)
  2. 在RW (第二个)加载段中使用.data和.bss标记.rodata节内容。

回答

0

想通了怎么办2,第一个转储默认的链接脚本,通过轮候册,-verbose编译器驱动程序链接步骤,然后修改通过删除线:

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

而且将它们相加背面与所述。数据部分:

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

修饰的链接脚本可以与-Wl,-T,pathToThatScript

可以使用
相关问题