什么是绝对符号以及如何在 C 中定义它?

Ken*_*Ken 5 c linker relocation ld linker-scripts

在手册页中nm。它说

\n\n
\n

\xe2\x80\x9cA\xe2\x80\x9d 符号的值是绝对的,不会因进一步链接而改变。

\n
\n\n

但是,我不知道这意味着什么。如何在 C 中定义一个变量或其他东西以使其值绝对?

\n\n

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

\n\n
int a;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
int a;\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我想知道我该怎么做才能使nm变量的输出 \xe2\x80\x9cA\xe2\x80\x9d 。而且我不知道 \xe2\x80\x9cabsolute\xe2\x80\x9d 是什么意思。

\n

das*_*ght 4

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

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

unsigned char buf[128]@0x2000;
Run Code Online (Sandbox Code Playgroud)

但这不是标准 C,而是嵌入式系统的扩展。这样的代码将buf在地址处产生一个绝对符号集0x2000,该符号不能被链接器移动。