GCC / objdump: генерация компилируемой / компилируемой сборки (с добавлением C / C ++) источника? - PullRequest
7 голосов
/ 04 августа 2011

Это близко к Использование 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, то есть:) )

Ответы [ 3 ]

1 голос
/ 05 августа 2011

«Зависимости», о которых вы говорите, часто происходят из библиотек или отдельных объектных файлов, поэтому у них нет источника - они просто связаны в виде двоичного кода в конечный исполняемый файл.Поскольку такой код не передается через ассемблер, вам придется извлечь его другими способами - например, с помощью objdump.

Может быть, вы должны сказать нам, чего вы действительно хотите достичь, потому что я неНе вижу особого смысла в таком упражнении.

1 голос
/ 01 сентября 2011

Лучшее, что я смог получить, это использовать -Wa,-ahl=outfile.s вместо -S. Это не компилируемый код, а список файлов для диагностических целей; скомпилированный объектный файл выдается как обычно.

1 голос
/ 04 августа 2011

Добавьте параметр -fverbose-asm в вашу командную строку gcc.(Это в руководстве по gcc, но задокументировано в разделе «Параметры кода Gen»)

...