2016-09-11 3 views
0

Возможно ли, чтобы LD печатал значение символа по мере его продвижения? Может быть, есть глупый способ просто распечатать значение?GCC: печать значения символа во время процесса ссылки?

Вот детали, связанные с моим вопросом для контекста:

Я компиляции кода для Cortex-M7 с использованием GCC 4.9. Процессор имеет два банка вспышки. 1 МБ каждый по 0x0020.0000 и 0x0800.0000.

В коде ЭЛТ он пытается установить относительную нагрузку ПК на адрес main на номер R2, а затем перейти к нему. Однако значение, сохраненное в таблице констант, неверно.

От отладчика разборки:

ldr r2, =APP_ENTRY_POINT 
    4A29  ldr r2, 0x002003B8 
--- thumb_crt0.s -- 226 ------------------------------------ 
blx r2 
    4790  blx r2 

objdump из thumb_crt0.o:

000000aa <start>: 
    aa: 2000  movs r0, #0 
    ac: 2100  movs r1, #0 
    ae: 4a29  ldr r2, [pc, #164] ; (154 <memory_set+0x8a>) 
    b0: 4790  blx r2 

Слово хранится при смещении:

ldr r2, =APP_ENTRY_POINT 
    080007ED .word 0x080007ED 

Фактический адрес главного согласно nm:

Silverback: nm Nucleo.elf | grep main 
002007ec N main 

ответ

0

Я нашел хороший вариант для ld печатать файле проекта на стандартный вывод, просто Grep, что вы хотите после этого:

g++ a.cpp -Wl,-M | grep -w main 

выходы (окна):

0x00000000004015dc    main 

Примечание: когда вы objdump несвязанный объектный файл, адреса переездов/вызовов часто ошибочны: компоновщик еще не запущен.

+0

Спасибо. У меня есть файл карты. Я понимаю, что объектный файл еще не найден. Что для меня было полезно, так это то, что он подсчитал относительную нагрузку на ПК, и это привело меня к отображению неправильного значения, хранящегося в смещении. В объектном файле вы можете увидеть, что он хочет заменить это место на main. – Kenny

+0

Существует также директивы 'ASSERT' и математическая операция, которые вы могли бы проверить переменную вместо ее печати. Тем не менее, mapfile всегда полезен. –

Смежные вопросы