Почему addr2line работает только для функций

У меня addr2line работает с адресами функций:

$ nm -S executable | grep main
08048742 000000a0 T main
$ addr2line -e executable 08048742
/home/blablabla/src/main.c:80

К сожалению, это работает только в том случае, если я указываю адрес функции, при передаче адреса символа данных (например, адреса таблицы crc) он никогда не может разрешить номер файла/строки:

$ nm -S executable | grep tableCRC
080491bc 00000200 r tableCRC
$ addr2line -e executable 080491bc
??:0

Я предполагаю, что такая отладочная информация просто не включена для данных, потому что эта функция, вероятно, предназначена для анализа обратных следов, но, может быть, есть опция компилятора/компоновщика, чтобы заставить это сделать?

Я хочу использовать вывод addr2line для получения подробной информации о том, сколько памяти использует файл или модуль (вместо глобального числа, сообщаемого инструментом «размер»).


person Bart    schedule 03.08.2011    source источник
comment
Имейте в виду, что если приложение динамически выделяет какую-либо память (что, вероятно, имеет место для любого нетривиального приложения), то любые оценки размера, основанные на такого рода анализе, не будут очень полезными.   -  person Michael Mior    schedule 03.08.2011
comment
@Michael Mior: я использую это для анализа размера кода для микроконтроллера с 8K RAM. malloc вообще не существует.   -  person Bart    schedule 04.08.2011
comment
Это, конечно, облегчает жизнь :)   -  person Michael Mior    schedule 04.08.2011


Ответы (1)


Варианты --print-size и --line-numbers для nm, вероятно, то, что вам нужно.

Обратите внимание, что объект ELF должен содержать отладочную информацию, чтобы опция --line-numbers работала.

person jkoshy    schedule 03.08.2011
comment
--line-numbers, как я мог пропустить это со страницы руководства. Спасибо! - person Bart; 03.08.2011