相关疑难解决方法(0)

如何将变量放在内存中的给定绝对地址(使用GCC)

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 variables gcc arm keil

25
推荐指数
5
解决办法
5万
查看次数

符号(@)和美元符号($)在C或C++中是否有任何特殊含义

最近我的一位朋友在接受采访时遇到了这个问题.面试官问他是否有特殊字符$, @, |, ^, ~在c或c ++中有任何使用方法.

我知道它们|, ^ and ~分别用作Bitwise OR,XOR和Complement.

但我不知道是否@ and $有任何特殊含义.如果有,请举例说明可以应用的地方吗?

c c++ special-characters

24
推荐指数
3
解决办法
2万
查看次数

什么是 *ABS* 部分以及何时使用?

// 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)

c binary linker gcc elf

5
推荐指数
1
解决办法
1471
查看次数

标签 统计

c ×3

gcc ×2

arm ×1

binary ×1

c++ ×1

elf ×1

keil ×1

linker ×1

special-characters ×1

variables ×1