我的链接器文件中的内存属性 'p' 是什么?

What is the memory attribute 'p' in my linker file?

在 GCC 中,MEMORY 命令描述目标中内存块的位置和大小。 命令必须用这个way.

MEMORY 
  {
    name [(attr)] : ORIGIN = origin, LENGTH = len
    ...
  }

现在,我有一个链接器使用的链接器文件(用于英飞凌 Tricore 微控制器的基于 GCC 的链接器,tricore-ld)以这种方式定义 RAM 内存部分:

MEMORY 
  {
    ram       (w!xp): org = 0x70000000, len = 32k
    ...
  }

你能解释一下 'p' 在 (w!xp) 中的意思吗? 'p' 通常是什么意思?

不是标准的链接描述文件,当然对于自定义微控制器目标来说并不罕见。也许很久以前就分叉了。然而,它可以很容易地进行逆向工程,GCC 一直对目标文件使用 ELF 格式。 Google "elf section attributes",弹出 this hit,在这里很有帮助。

所以你得到了 alloc、exec、write、progbits。啊哈,p == progbits。所以 (w!xp) 肯定应该解释为 "section is writable, not executable, initial data is stored in the executable image".

没什么特别的,那是 C 程序中的传统 .data 部分。比较 .bss,而不是 p.


OP 添加的信息:

从这个 presentation 关于 UNIX ELF 格式:

  • PROGBITS:保存程序内容,包括代码、数据和调试器信息。

  • NOBITS:和 PROGBITS 一样。但是,它不占用 space。

  • SYMTAB 和 DYNSYM:它们包含符号 table。

  • STRTAB:这是一个字符串 table,就像在 a.out.

  • 中使用的一样
  • REL 和 RELA:它们包含重定位信息。

  • DYNAMIC 和 HASH:这包含与动态链接相关的信息。