RealView ARM C编译器支持使用变量属性将变量放在给定的内存地址at(address)
:
int var __attribute__((at(0x40001000)));
var = 4; // changes the memory located at 0x40001000
Run Code Online (Sandbox Code Playgroud)
GCC是否具有类似的变量属性?
最近我的一位朋友在接受采访时遇到了这个问题.面试官问他是否有特殊字符$, @, |, ^, ~
在c或c ++中有任何使用方法.
我知道它们|, ^ and ~
分别用作Bitwise OR,XOR和Complement.
但我不知道是否@ and $
有任何特殊含义.如果有,请举例说明可以应用的地方吗?
// foo.c
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)
当我编译上面的代码时,我注意到一些符号位于*ABS*
:
$ gcc foo.c
$ objdump -t a.out | grep ABS
0000000000000000 l df *ABS* 0000000000000000 crtstuff.c
0000000000000000 l df *ABS* 0000000000000000 foo.c
0000000000000000 l df *ABS* 0000000000000000 crtstuff.c
0000000000000000 l df *ABS* 0000000000000000
Run Code Online (Sandbox Code Playgroud)
看起来它们是一些调试符号,但调试信息不是存储在类似.debug_info
部分的地方吗?
根据man objdump
:
*ABS* 如果该部分是绝对的(即不与任何部分连接)
我不明白,因为这里没有给出例子。
这里的问题显示了一种有趣的方式来传递一些额外的符号*ABS*
by --defsym
。但我认为通过传递宏可能会更容易。
那么这个*ABS*
部分是什么,什么时候有人会使用它?
编辑:
绝对符号不会被重新定位,它们的虚拟地址(在您给出的示例中为 0000000000000000)是固定的。
我写了一个演示,但似乎可以修改绝对符号的地址。
$ gcc foo.c
$ objdump -t a.out | grep ABS
0000000000000000 l …
Run Code Online (Sandbox Code Playgroud)