GCC将所有字符串存储在.rodata中

GCC将所有字符串存储在.rodata中,c,gcc,kernel,x86-64,elf,C,Gcc,Kernel,X86 64,Elf,在x86-64内核中,我试图将.rodataELF部分映射为只读。但所有字符串文字都存储在特定于文件的部分,例如.rodata.str1.8。GCC是否可以选择将所有字符串存储在.rodata中,或者我是否可以使用ld、objdump或其他方法将.rodata.str.x连接到.rodata>中 ENTRY(_start) SECTIONS { . = 0xC0100000; kernel_memory_start = .; .boot ALIGN(8) : { *(.mu

在x86-64内核中,我试图将
.rodata
ELF部分映射为只读。但所有字符串文字都存储在特定于文件的部分,例如
.rodata.str1.8
。GCC是否可以选择将所有字符串存储在
.rodata
中,或者我是否可以使用
ld
objdump
或其他方法将
.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 ...

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

这难道不是链接器脚本应该做的吗?!也许您应该提供一个适当的解释,说明您现在正在做什么通常这是为了COMDAT解决方案。简单来说,这是为了避免创建重复的字符串。但是链接后的内容应该合并成一个单独的部分。至少你可以告诉你的链接器这样做,所以这可能看起来有点离经叛道,但我很好奇,如果这是在MacOS上?