什么是绝对符号以及如何在C中定义它?
在什么是绝对符号以及如何在C中定义它?,c,linker,ld,linker-scripts,relocation,C,Linker,Ld,Linker Scripts,Relocation,在nm的手册页中。上面说 “A”符号的值是绝对值,不会因进一步链接而更改 然而,我不知道这意味着什么。如何定义变量或其他东西,使其值在C中为绝对值 如果我在test.c的文件范围内声明一个变量 int a; 然后在nm的输出中,a的条目将在我的机器上显示如下 000000000000000 4 C a 所以我想知道我该怎么做才能使变量的nm输出为“A”。我不知道“绝对”是什么意思。当C编译器编译程序时,除了程序的二进制代码外,它还会生成一个符号列表。您将看到的最常见类型是Us(表示“未定义”
nm
的手册页中。上面说
“A”符号的值是绝对值,不会因进一步链接而更改
然而,我不知道这意味着什么。如何定义变量或其他东西,使其值在C中为绝对值
如果我在test.c
的文件范围内声明一个变量
int a;
然后在nm
的输出中,a的条目将在我的机器上显示如下
000000000000000 4 C a
所以我想知道我该怎么做才能使变量的
nm
输出为“A”。我不知道“绝对”是什么意思。当C编译器编译程序时,除了程序的二进制代码外,它还会生成一个符号列表。您将看到的最常见类型是U
s(表示“未定义”)、D
s和s
s(表示全局数据)和T
s(表示“文本”段,即可执行代码所在的位置)
A
s或绝对(不可移动)符号用于支持嵌入式开发,其中需要将事物放置在内存中的绝对地址。通常,只有在为嵌入式系统进行交叉编译时,才能使用允许指定绝对地址的C语言扩展生成这样的符号。典型的语法如下所示:
unsigned char buf[128]@0x2000;
这不是一个标准的C,但是,它是嵌入式系统的扩展。这样的代码将产生一个绝对符号
buf
设置在地址0x2000
,链接器无法移动该符号。这与C@Olaf为什么这与C无关?你读过这个标题吗?我想可能会有兴趣。@Lefteris谢谢你的评论。我已经看过那篇文章了。但是,答案是我需要使用链接器脚本来完成它。你知道没有链接器脚本我有什么方法可以做到吗?因为C标准甚至没有绝对或相对符号。这是一个环境问题。这是特定于公司的。甚至不是每个嵌入式编译器都会接受这一点。而且具有绝对地址的对象可能也必须是易变的。@Olaf绝对正确,这甚至不接近标准。这就是为什么我写了“C语言扩展”…,它是嵌入式系统的扩展“听起来像是嵌入式系统的标准,所以这样的编译器将支持这一点。这就是我评论的原因。听起来很奇怪,仅仅正确地转换一个整数常量通常是更“可移植”的方式(考虑到我们已经超出了标准)。请注意,dos也经常使用这种方式。键盘访问和textmode视频缓冲区访问(不仅仅是简单的基于行的使用)通常使用这样的变量。