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

djo*_*dal 8 c ld linker-scripts

在GCC中,MEMORY命令描述目标中内存块的位置和大小.必须以这种方式使用该命令.

MEMORY 
  {
    name [(attr)] : ORIGIN = origin, LENGTH = len
    ...
  }
Run Code Online (Sandbox Code Playgroud)

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

MEMORY 
  {
    ram       (w!xp): org = 0x70000000, len = 32k
    ...
  }
Run Code Online (Sandbox Code Playgroud)

你能解释(p!x p)中'p'的含义吗?'p'一般意味着什么?

Han*_*ant 1

不是标准链接器脚本,当然对于自定义微控制器目标来说并不罕见。也许很久以前就分叉了。然而它可以很容易地进行逆向工程,GCC 始终使用 ELF 格式作为目标文件。谷歌“精灵部分属性”,弹出这个点击,在这里非常有帮助。

所以你有分配、执行、写入、progbits。啊哈,p == progbits。所以 (w!xp) 肯定应该被解释为“该部分是可写的,不可执行的,初始数据存储在可执行映像中”。

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


OP添加的信息:

来自UNIX ELF 格式的演示:

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

  • NOBITS:就像 PROGBITS 一样。然而,它不占用任何空间。

  • SYMTAB 和 DYNSYM:它们保存符号表。

  • STRTAB:这是一个字符串表,就像 a.out 中使用的那样。

  • REL 和 RELA:它们保存重定位信息。

  • DYNAMIC 和 HASH:保存与动态链接相关的信息。