Подтвердить что ты не робот

Как я могу получить исходные строки inline с выходом сборки с помощью GCC?

Я хочу, чтобы исходные строки C были встроены в вывод сборки, чтобы увидеть, какой код генерируется.

Я попробовал варианты GCC, такие как -S -Wa,-ahlms (и даже -Wa,--gstabs, потому что я его где-то читал).

О! BTW, я нахожусь на Mac, поэтому у меня нет objdump.

(Извините, это коротко, мне нужно сойти с поезда!)

Вывод gcc pc-clisp.c -S -g -fverbose-asm -fnested-functions

.globl _getBool
_getBool:
LFB32:
LM21:
    pushl   %ebp    #
LCFI30:
    movl    %esp, %ebp      #,
LCFI31:
    subl    $8, %esp        #,
LCFI32:
LM22:
    movzbl  8(%ebp), %eax   # atom.pred, D.4112
    movzbl  %al, %eax       # D.4112, D.4113
    andl    $-16, %eax      #, D.4114
    sarl    $4, %eax        #, D.4115
    testl   %eax, %eax      # D.4115
    setne   %al     #, tmp64
    movzbl  %al, %eax       # tmp64, D.4111
    leave
    ret
LFE32:
4b9b3361

Ответ 1

Может быть, debug + post-process step?

gcc <source.c> -S -g -fverbose-asm

Найти .file 1 "1.c", чтобы указать номер файла для сопоставления имен файлов. Затем добавьте источник после строк .loc 1 8 0. Я не уверен, как это сделать с помощью одной команды оболочки, но короткий script должен иметь возможность сделать это:

#!/usr/bin/env python

import re
import sys

filename = sys.argv[1]

f = open(filename)
lines = f.readlines()
f.close()

FILE_RE=re.compile(r"\s+\.file (\d+) \"(.*)\"")
LOC_RE =re.compile(r"\s+\.loc (\d+) (\d+)")

output = []
files = {}
for line in lines:
    output.append(line)
    mo = FILE_RE.match(line)
    if mo is not None:
       files[mo.group(1)] = open(mo.group(2)).readlines()
       print mo.group(1),"=",mo.group(2)
       continue
    mo = LOC_RE.match(line)
    if mo is not None:
       print mo.group(1),"=",mo.group(2)
       source = files[mo.group(1)][int(mo.group(2))-1]
       output.append("\t#"+source)

f = open(filename+".2","w")
f.writelines(output)
f.close()

Ответ 2

Это не совсем то, о чем вы просите, но вы можете найти -S -fverbose-asm полезным.

Ответ 3

вы можете получить objdump через macports. просто заполните пакет "binutils", а затем используйте "gobjdump"