【问题标题】:GCC store all strings in .rodataGCC 将所有字符串存储在 .rodata 中
【发布时间】:2025-12-05 14:05:01
【问题描述】:

在我的 x86-64 内核中,我试图将 .rodata ELF 部分映射为只读。但是所有字符串文字都存储在特定于文件的部分中,例如.rodata.str1.8。 GCC 是否有任何选项可以将所有字符串存储在 .rodata 中,或者我可以使用 ldobjdump 或其他任何东西将 .rodata.str.x 连接到 .rodata 中?

ENTRY(_start)

SECTIONS {
  . = 0xC0100000;
  kernel_memory_start = .;
  .boot ALIGN(8) :
  {
  *(.multiboot)
  }

  .text ALIGN(4K) : AT(ADDR(.text) - 0xC0000000)
  {
  kernel_text_start = .;
    *(.text)
  }
  kernel_text_end = .;
  .rodata ALIGN(4K) : AT(ADDR(.rodata) - 0xC0000000)
  {
    kernel_rodata_start = .;
  *(.rodata)
  }
  kernel_rodata_end = .;

  .data ALIGN(4K) : AT(ADDR(.data) - 0xC0000000)
  {
  kernel_data_start = .;
    *(.data)
  }
  kernel_data_end = .;

  .bss ALIGN(4K) : AT(ADDR(.bss) - 0xC0000000)
  {
  kernel_bss_start = .;
    *(.bss)
  }
  kernel_bss_end = .;
  kernel_memory_end = .;
}

编译器标志:

gcc -ffreestanding -mcmodel=large -fno-pic -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-3dnow -mno-80387 -fno-unwind-tables ...

链接器标志:

ld -nostdlib -n ...

【问题讨论】:

  • 这不是你的链接器脚本应该做的吗?!
  • 也许你应该提供一个正确的minimal reproducible example 解释你现在在做什么
  • 通常这是为 COMDAT 解析完成的。简单来说,就是避免创建重复的字符串。但是链接后应该将它们全部组合成一个部分。至少你可以告诉你的链接器这样做
  • 这似乎有点离经叛道,但我很好奇这是否在 MacOS 上?

标签: c gcc kernel x86-64 elf


【解决方案1】:

在您的链接器文件中,使用 *(.rodata*)

【讨论】:

    最近更新 更多