首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >gcc将告诉一个从哪个变量编译的寄存器

gcc将告诉一个从哪个变量编译的寄存器
EN

Stack Overflow用户
提问于 2011-02-02 22:21:14
回答 3查看 422关注 0票数 1

我需要知道从哪个变量中编译obj文件中二进制指令的寄存器。

简而言之:每个指令从寄存器到变量的映射

示例:假设objdump提供obj文件的片段,如下所示:

代码语言:javascript
运行
复制
MOV R1 5        # move 5 to register R1
SW R2 SP[-20]   # store the value of R2 to address SP-20

我们如何知道R1存储了源代码中的变量,例如,var1?和R2商店var2

我搜索了readelf的文档,不幸的是徒劳无功。

(虽然它可以给我源和二进制之间的行映射,但对我没有进一步的帮助)

然后我寻找gcc和链接器的一些调试选项。找到了一些有用的信息,但他们仍然解决不了我的问题。

我发现的信息是:

-fdump-rtl-vartrack

  • 选项可以跟踪所有变量,并且似乎很有用。但是,在用这个option.
  • Option *fdump-rtl-vartrack-uid编译时,我没有找到预期的*.vartrack转储文件,它显示了每个变量的唯一ID (DECL_UID)。但是当我使用它时,我收到了这个错误: cc1: cc1:un为人所识别的命令行选项cc1转储本地寄存器分配,但我看不出它如何告诉我从reg到变量的映射。

有人有什么经验或想法吗?

谢谢大家!

黑进去..。

EN

回答 3

Stack Overflow用户

发布于 2011-02-02 23:54:13

编译器通常会生成一个混合的汇编程序/源代码列表。它将显示它编译的源代码,并在下面显示生成的汇编程序代码。一个快速的谷歌

http://www.delorie.com/djgpp/v2faq/faq8_20.html

票数 0
EN

Stack Overflow用户

发布于 2011-02-23 13:56:24

GCC的“一言为定-asm”选项可能会有所帮助。它用变量名对编译器的输出进行注释。不幸的是,这些名称往往是编译器发明的临时名称,如"D.1234“。它仍然可以帮助你了解正在发生的事情。

试着编译一些简单的内容并看一看:

代码语言:javascript
运行
复制
gcc -g -O0 -S -fverbose-asm foo.c -o foo.s

像GDB这样的调试器确定在程序中的给定位置存储变量的方式(对于大多数系统来说)是使用编译器生成并存储在对象文件中的矮小调试信息。如果您的系统使用的是侏儒,那么readelf将为您做一些非常基本的解释。试试这个:

代码语言:javascript
运行
复制
readelf --debug-dump=info foo.o

很明显,解码并不简单。如果你想试一试,那就看看http://dwarfstd.org/的矮人标准。

票数 0
EN

Stack Overflow用户

发布于 2019-07-04 07:28:52

为此,您可以使用标志:

代码语言:javascript
运行
复制
gcc foo.c -da -dp -fdump-tree-all-raw-lineno

其中:

-da生成所有RTL转储

-dp用注释来注释汇编程序输出,说明使用了哪些模式和替代方案。

-fdump-tree-all-raw-lineno支持显示语句的行号。

这将创建大约167个文件,每个文件都意味着GIMPLE和RTL传递、优化等的不同阶段。以下是简单的解释:

https://www.cse.iitb.ac.in/~uday/courses/cs715-09/gcc-rtl.pdf

最有用的转储是:

代码语言:javascript
运行
复制
foo.c.227t.optimized
foo.c.229r.expand
foo.c.259r.combine
foo.c.307r.finish

还有其他几种不同的用途。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4880584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档