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

我需要知道哪个变量是从obj文件中编译的二进制指令的寄存器。 简而言之:每个指令从寄存器到变量的映射 示例:假设objdump给出了一段obj文件:
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可以跟踪所有变量,似乎很有用。但是在使用此选项进行编译时,我没有找到预期的* .vartrack转储文件。 选项* fdump-rtl-vartrack-uid显示每个变量的唯一ID(DECL_UID)。但是在使用它时我收到了这个错误:cc1:错误:无法识别的命令行选项“-fdump-tree-uid” 选项fdump-rtl-lreg转储本地寄存器分配,但我不知道它如何告诉我从reg到变量的映射。 有没有人有经验或想法? 谢谢你们! 黑客攻击......     
已邀请:
编译器生成混合汇编程序/源代码列表是很常见的。它将显示它编译的源代码,并在其下方显示生成的汇编代码。一个快速的谷歌给出 http://www.delorie.com/djgpp/v2faq/faq8_20.html     
海湾合作委员会的“-fverbose-asm”选项可能会有所帮助。它使用变量名称注释编译器的输出。不幸的是,名称通常是编译器发明的临时名称,例如“D.1234”。它仍然可以帮助您了解正在发生的事情。 尝试编译简单的东西并看看:
gcc -g -O0 -S -fverbose-asm foo.c -o foo.s
像GDB这样的调试器使用由编译器生成并存储在目标文件中的DWARF调试信息来确定变量存储在程序中给定点的位置(对于大多数系统)。如果您的系统使用DWARF,那么readelf将为您对此信息做一些非常基本的解释。试试这个:
readelf --debug-dump=info foo.o
解码显然不是一件容易的事。如果你想去,请查看http://dwarfstd.org/上的DWARF标准。     

要回复问题请先登录注册