gpt4 book ai didi

linux - 有没有办法将 .rodata 段映射到不同的程序头中?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:17 28 4
gpt4 key购买 nike

在共享库 (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

这些 map 分别对应以下部分:

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~0x200000 字节远离我的 .data)
  2. .rodata段内容与RW中的.data.bss并置(二)加载段。

最佳答案

想出如何做 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一起使用

关于linux - 有没有办法将 .rodata 段映射到不同的程序头中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42497349/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com