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

标签 linux linker ld

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

相关文章:

c++ - 与 raspicam 库链接时链接器/加载器错误 "undefined reference to ..."

linux - 如何在 Git 上配置 socks5 代理

c - 使用多个 NIC 广播 UDP 数据包

c++ - 调用 operator<< 时出现链接器错误,如何解决?

c++ - QT造物主: Cannot include functions from other files in QT Creator c project

xcode - 来自链接器的奇怪警告(ld)

linux - Bash:if语句总是成功

rgdal 不会安装在 docker ubuntu 18.04 "ERROR::command not found"

c++ - 如何获取 OCaml 链接器标志以与 C++ cmake 构建链接

c++ - 链接器链接正确的文件,但找不到符号