【问题标题】:What is absolute symbol and how to define it in C?什么是绝对符号以及如何在 C 中定义它?
【发布时间】:2016-01-24 06:33:15
【问题描述】:

nm 的手册页中。它说

“A”符号的值是绝对值,不会被进一步链接改变。

但是,我不知道那是什么意思。如何定义变量或其他东西以使其值在在 C 中是绝对的?

如果我在 test.c 的文件范围内声明一个变量

int a;

然后在nm的输出中,我的机器上a的条目将如下

0000000000000004 C a

所以我想知道如何使nm 为变量输出“A”。而且我不知道“绝对”是什么意思。

【问题讨论】:

  • 这与C无关
  • @Olaf 为什么这与 C 无关?你读过标题吗?
  • 我相信this 可能会引起您的兴趣。
  • @Lefteris 感谢您的评论。我已经读过那个帖子了。但是,答案说我需要使用链接器脚本来做到这一点。你知道没有链接器脚本有什么方法可以做到吗?
  • @Olaf 是的,我知道它与 C 标准无关,但这一事实并没有使问题与 C 无关。如果我问一个关于如何在 C 中实现某些东西的问题,那么这与C 因为它在 C 中的完成方式与在其他语言中的完成方式不同。如果我只是询问绝对符号或二叉树的概念,那么肯定它与 C 完全无关。你明白我的意思吗?

标签: c linker ld linker-scripts relocation


【解决方案1】:

当 C 编译器编译您的程序时,除了程序的二进制代码之外,它还会生成一个符号列表。您将看到的最常见的类型是Us(用于“未定义”)、Ds 和Ss(用于全局数据)和Ts(用于“文本”段,其中是可执行代码所在的位置)。

As 或 absolute(不可移动)符号用于支持嵌入式开发,其中需要将事物放置在内存中的绝对地址。通常,只有在针对嵌入式系统进行交叉编译时才会生成这样的符号,使用允许您指定绝对地址的 C 语言扩展。典型的语法如下所示:

unsigned char buf[128]@0x2000;

不过,这不是标准的 C,它是嵌入式系统的扩展。这样的代码会产生一个绝对符号buf 设置在地址0x2000,链接器不能移动它。

【讨论】:

  • 这是特定于编译器的。甚至不是每个嵌入式编译器都会接受这一点。具有绝对地址的对象也可能必须是 volatile
  • @Olaf 绝对正确,这甚至不接近标准。这就是我写“C语言扩展”的原因。
  • "... ,它是嵌入式系统的扩展" 听起来它是嵌入式系统的标准,因此此类编译器将支持这一点。这就是我发表评论的原因。听起来很奇怪,正确地转换一个整数常量通常是更“可移植”的方式(考虑到我们无论如何都超出了标准)。
  • 注意dos也常用这个。键盘访问和文本模式视频缓冲区访问(不仅仅是简单的基于行的使用)通常使用此类变量。
猜你喜欢
  • 2013-11-29
  • 2016-02-26
  • 2018-11-11
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多