我有以下c ++代码
#include <iostream>
using namespace std;
int a=100;
int &b = a;
int main ( int argc, char ** argv)
{
cout << " a "<<a<<" b"<<b<<endl;
b = 200;
cout <<"a "<<a<<endl;
}
我想在目标文件的符号表中看到a和b的地址?
#gcc -g -o ref ref.cpp -lstdc++
有像objdump,readelf这样的工具。但我不熟悉这些工具。请赞成使用suggession的方法来查找目标文件中的a和b的地址[即:在符号表中]
注意:我已编辑将变量从本地移动到全局。
答案 0 :(得分:4)
引用变量的地址与它引用的对象的地址相同 即:
&b == &a
这标准很明确,并且永远都是正确的 想要实现什么目标?
答案 1 :(得分:1)
cout << " &a " << &a <<" &b "<< &b <<endl;
这将显示两者的地址,并确认它们位于同一地址。
答案 2 :(得分:0)
这些是在堆栈上分配的局部变量。程序运行时会获得内存和地址。
您不会从目标文件中获取地址。
答案 3 :(得分:0)
查看地址的唯一方法是使用像objdump这样的工具,但是你永远不会看到局部变量的地址。它们在编译时不存在,在运行时分配在堆栈中。你在exe中看到的唯一东西是执行push或sub sp的asm / machine代码,这是分配。
如果您将程序更改为:
#include <iostream>
using namespace std;
int main ( int argc, char ** argv)
{
static int a=100;
static int &b = a;
cout << " a "<<a<<" b"<<b<<endl;
b = 200;
cout <<"a "<<a<<endl;
}
然后编译完成后:
objdump -t ref | grep数据
你会看到:
080488a8 l d .rodata 00000000 .rodata
08049a94 l d .data 00000000 .data
080488bc l O .rodata 00000004 _ZZ4mainE6b
08049a9c l O .data 00000004 _ZZ4mainE6a
08049a94 w .data 00000000 data_start
080488a8 g O .rodata 00000004 _fp_hw
080488ac g O .rodata 00000004 _IO_stdin_used
08049a94 g .data 00000000 __data_start
08049a98 g O .data 00000000 .hidden __dso_handle
08049aa0 g *ABS* 00000000 _edata
您正在寻找的变量是_ZZ4mainE6a _ZZ4mainE6b(这些是它们的错位名称)。
编辑:对于当前版本的示例代码,使用&amp; b作为全局变量,a将是.text和b .rodata,所以现在你必须在grep过滤器中使用“text”才能看到。
答案 4 :(得分:0)
您可以在最终的可执行文件中使用“nm”工具。 像这样:
$ nm -C你好 080490ba A __bss_start 080490ba A _edata 080490bc A _end 08048083 T _start 08048080 t access.the.bsd.kernel 080490ac d hbytes 080490ac你好 $
输出的第一列是符号的地址,之后是其类型,然后是其名称。