在共享库(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),并希望了解黑魔法咒语以执行以下任一操作:
.rodata
部分,以便我可以.data
,.bss
和.rodata
彼此靠近(而默认链接布局放置我的.rodata
距离.data
} .rodata
部分内容与.data
和.bss
放在RW中
(第二)负荷部分。答案 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