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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GCC将所有字符串存储在.rodata中相关的知识,希望对你有一定的参考价值。

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

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 *)

以上是关于GCC将所有字符串存储在.rodata中的主要内容,如果未能解决你的问题,请参考以下文章

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?

GET,POST的同步和异步所有中代码方法

vim中代码多行删除

重定位被截断以适应:R_386_8 针对“.rodata”

Java中代码优化的30个小技巧

第一次在AWS中代码运行缓慢