Это близко к Использование GCC для создания читаемой сборки? , но мой контекст здесь avr-gcc
(и, соответственно, avr-objdump
) для Atmel (хотя, я думаю, это будет применяться во всем GCC доска).
Дело в том, что у меня есть проект из нескольких файлов .c и .cpp; которые в конечном итоге компилируются в исполняемый файл с тем же именем, что и «master» .cpp файл В этом процессе я могу получить листинг сборки двумя способами:
- Я могу поручить
gcc
выдать источник списка сборки (см. Сборка и разборка Linux Введение ) с помощью переключателя -S
; в этом случае я получаю файл с содержимым вроде:
...
loop:
push r14
push r15
push r16
push r17
push r28
push r29
/* prologue: function <em>/
/</em> frame size = 0 */
ldi r24,lo8(13)
ldi r22,lo8(1)
call digitalWrite
rjmp .L2
.L3:
ldi r24,lo8(MyObj)
ldi r25,hi8(MyObj)
call _ZN16MYOBJ7connectEv
.L2:
ldi r24,lo8(MyObj)
ldi r25,hi8(MyObj)
call _ZN16MYOBJ11isConnectedEv
...
( Еще не пробовал; но я думаю, этот код компилируется / компилируется .... )
- Я могу проверить конечный исполняемый файл с помощью
objdump
и дать команду на вывод источника списка сборки, используя переключатель -S
; в этом случае я получаю файл с содержимым вроде:
...
0000066a <init>:
void init()
{
// this needs to be called before setup() or some functions won't
// work there
sei();
66a: 78 94 sei
66c: 83 b7 in r24, 0x33 ; 51
66e: 84 60 ori r24, 0x04 ; 4
670: 83 bf out 0x33, r24 ; 51
...
000006be <loop>:
6be: ef 92 push r14
6c0: ff 92 push r15
6c2: 0f 93 push r16
6c4: 1f 93 push r17
6c6: cf 93 push r28
6c8: df 93 push r29
6ca: 8d e0 ldi r24, 0x0D ; 13
6cc: 61 e0 ldi r22, 0x01 ; 1
6ce: 0e 94 23 02 call 0x446 ; 0x446
6d2: 04 c0 rjmp .+8 ; 0x6dc
6d4: 8d ef ldi r24, 0xFD ; 253
6d6: 94 e0 ldi r25, 0x04 ; 4
6d8: 0e 94 25 06 call 0xc4a ; 0xc4a <_ZN16MYOBJ7connectEv>
6dc: 8d ef ldi r24, 0xFD ; 253
6de: 94 e0 ldi r25, 0x04 ; 4
6e0: 0e 94 21 06 call 0xc42 ; 0xc42 <_ZN16MYOBJ11isConnectedEv>
...
( Я пытался создать этот код, но он не удался - он читает «номера строк» как метки )
Очевидно, что оба листинга (по крайней мере для функции loop
) представляют один и тот же код сборки; за исключением:
- Компиляция
gcc
one (должна) - objdump
one not
-
objdump
содержит списки всех упомянутых функций, которые могут быть определены в файлах, отличных от 'master' (например, digitalWrite
) - gcc
делает , а не
- Одна
objdump
содержит исходные строки исходного кода C / C ++, «перемежающиеся» со сборкой (но только изредка и, по-видимому, только для файлов C?) - gcc
одна делает не
Итак, есть ли способ получить список сборок, который был бы «компилируемым», однако со всеми встроенными функциями, и где исходный код C / C ++ (возможно, там, где это уместно) перемежается как комментарии (так что они не не мешает составлению сборочного файла)? ( если не считать парсера для вывода objdump
, то есть:) )