Ken*_*Ken 5 c linker relocation ld linker-scripts
在手册页中nm
。它说
\n\n\n\xe2\x80\x9cA\xe2\x80\x9d 符号的值是绝对的,不会因进一步链接而改变。
\n
但是,我不知道这意味着什么。如何在 C 中定义一个变量或其他东西以使其值绝对?
\n\ntest.c
如果我在其文件范围内声明一个变量
int a;\n
Run Code Online (Sandbox Code Playgroud)\n\n然后在 的输出中nm
,a 的条目在我的机器上将如下
int a;\n
Run Code Online (Sandbox Code Playgroud)\n\n所以我想知道我该怎么做才能使nm
变量的输出 \xe2\x80\x9cA\xe2\x80\x9d 。而且我不知道 \xe2\x80\x9cabsolute\xe2\x80\x9d 是什么意思。
当 C 编译器编译程序时,除了程序的二进制代码之外,它还会生成符号列表。您将看到的最常见类型是U
s(表示“未定义”)、D
s 和S
s(表示全局数据)以及T
s(表示“文本”段,这是可执行代码所在的位置)。
A
s 或绝对(不可移动)符号用于支持嵌入式开发,其中需要将事物放置在内存中的绝对地址处。通常,只有在对嵌入式系统进行交叉编译时,才会使用允许您指定绝对地址的 C 语言扩展来生成此类符号。典型的语法如下所示:
unsigned char buf[128]@0x2000;
Run Code Online (Sandbox Code Playgroud)
但这不是标准 C,而是嵌入式系统的扩展。这样的代码将buf
在地址处产生一个绝对符号集0x2000
,该符号不能被链接器移动。