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)、および以下のいずれかを実行するために黒魔術の呪文を知っていただきたいと思います:
- 追加(R-モード)LOADプログラムヘッダを作成します。 .rodataセクションを保持するように.data、.bss、および.rodataはすべてお近くにあります(既定のリンクレイアウトは私の.rodataを私の.dataから 〜0x200000バイト離れた場所に配置します)
- RW (第2の)ロードセグメントの.dataと.bssで.rodataセクションの内容をコロケーションします。
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } .rodata1 : { *(.rodata1) }
そして: