Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是绝对符号以及如何在C中定义它?_C_Linker_Ld_Linker Scripts_Relocation - Fatal编程技术网

什么是绝对符号以及如何在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视频缓冲区访问(不仅仅是简单的基于行的使用)通常使用这样的变量。