2017-02-27 7 views
0

は共有ライブラリ(Linuxのx86_64版)のためのreadelfが--segments出力では、最初のいくつかのプログラムヘッダは以下のとおりです。.rodataセグメントを別のプログラムヘッダーにマップする方法はありますか?

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から 〜0x200000バイト離れた場所に配置します)
  2. RW (第2の)ロードセグメントの.dataと.bssで.rodataセクションの内容をコロケーションします。

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

    そして:

答えて

0

は、その行を削除することによって2が最初に修正コンパイラ・ドライバ・リンクステップに-verbose -Wlを渡し、および、デフォルトのリンカスクリプトをダンプ行う方法を考え出しました.dataのセクションでバックでそれらを追加:

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

修正リンカスクリプトは-Wl、-T、pathToThatScript

で使用することができます
関連する問題