Единственный способ увидеть адрес действительно с помощью таких инструментов, как objdump, но вы никогда не увидите адрес локальных переменных. Они не существуют во время компиляции, выделяются в стек во время выполнения. Единственное, что вы увидите в exe, это asm/машинный код, который выполняет push или sub sp, который является распределением.
Если вы измените свою программу:
#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 реф | Данные 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 (это их исковерканные имена).
EDIT: для текущей версии вашего образца кода с & b в качестве глобальных символов, будет отображаться .text и b .rodata, поэтому теперь вам нужно будет использовать «текст» в grep-фильтре, чтобы увидеть ,
Что вы подразумеваете под их адресом в объектном файле? Это стек (автоматические) переменные. Они не должны появляться нигде в таблице символов. (Только в отладочной информации.) – Mat
@Mat, моя ошибка. Я сделал обе переменные глобальными. – Whoami