【问题标题】:How can I declare a variable at an absolute address with GCC?如何使用 GCC 在绝对地址处声明变量?
【发布时间】:2015-10-29 05:21:40
【问题描述】:

我们正在研究链接器在我的一门课程中的工作原理,其中一项作业是一个涉及nm 命令的小练习。本质上,我们只想匹配nm 为每个变量打印的类型和值。例如:

char* B = NULL;

将给出地址(不相关)然后 B B。我已经成功完成了除 A 之外的所有我们需要的标签。我读过这只是意味着该值是绝对的,不能被链接器更改。我已经尝试了许多组合,包括volatileconststatic、define 以及我想尝试的任何其他东西,但我目前没有想法。我在其他地方读到,这只能通过创建链接器脚本来实现,但事实并非如此,因为我的一些同行已经用 C 中的一行解决了这个问题。任何人都可以在 C 中找到一种方法输出:

some address A A
...

nm 在它的目标文件上被调用了吗?

【问题讨论】:

  • 所以你要的是一个程序的 C 源代码,这样当nm 以它的编译形式运行时,输出将包含一个名为“A”的变量的地址?跨度>
  • 是的,我想从源代码中调用目标文件上的 nm 以输出:000000000000002a A A。但是“000000000000002a”并不重要
  • C 语言没有以任何方式解决哪个 地址分配给任何特定符号的问题,也没有解决符号重定位的问题。 nm 实用程序所做的一切都超出了它的范围。特定的编译器可能会识别允许你做你想做的事情的扩展;你用的是什么编译器?

标签: c gcc linker declaration absolute


【解决方案1】:

在标准 C 中定义绝对符号有点棘手。但是你可以使用非标准的内联汇编:

$ cat x.c
asm (".globl A");
asm ("A = 0x42");
$ clang -c x.c
$ nm x.o
0000000000000042 A A

【讨论】:

  • 哦,哇,甚至不知道你能做到这一点,猜猜这就是为什么它是额外的功劳,谢谢!刚刚注意到搭便车参考,很好。
  • 还可以使用“A org 0x42”将“A”标签放置在地址 0x42
猜你喜欢
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2014-11-17
  • 2013-05-10
  • 2014-09-19
  • 1970-01-01
相关资源
最近更新 更多