2010-03-09 9 views
13

Mi piacerebbe ottenere le linee di origine C in linea con l'output dell'assieme per vedere quale codice viene generato.Come posso ottenere le linee sorgente in linea con l'output dell'assieme usando GCC?

Ho provato le opzioni GCC come -S-Wa,-ahlms (e anche -Wa,--gstabs perché l'ho letto da qualche parte).

Oh! A proposito, io sono su un Mac, quindi non ho objdump.

(Spiacente, questo è breve, devo scendere dal treno!)

uscita di 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: 
+0

Sembra che quello che voglio fare non possa essere fatto facilmente su un Mac. 1) non ci sono 'objdump' e' otools' non fa il lavoro neanche. 2) 'gdb' nelle versioni più recenti ha' disas/m '- il Mac ha un' gdb' più vecchio. 3) Sospetto che l'output assembler di 'GCC' non sia molto utile su Mac. 4) Perché dovrei essere costretto a usare 'XCode'? (Non rispondere a questo). – philcolbourn

+0

Poco dopo questa domanda ho installato Linux e rinuncio a OS-X, ma Douglas sembra essere più vicino a una soluzione. – philcolbourn

+0

Se stai osservando piccole porzioni di codice Godbolt può essere una soluzione più semplice come me [spiega in questa risposta] (http://stackoverflow.com/a/25781924/1708801). –

risposta

10

Forse debug + un passaggio post-processo?

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

Trova .file 1 "1.c" per dirvi il numero di file al nome del file di mapping. Quindi aggiungere la fonte dopo le linee .loc 1 8 0. Non sono sicuro di come farlo con un singolo comando di shell, ma un breve script dovrebbe essere in grado di farlo:

#!/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() 
+0

Grazie. Questo sembra interessante. Tuttavia il file assembler non contiene le istruzioni .file né .loc. Pubblicherò l'assemblatore nella domanda. – philcolbourn

+1

È possibile ottenere le righe ".loc" aggiungendo "-g" alla riga di comando gcc. +1 a Douglas per uno script utile: esattamente quello che stavo cercando. Non c'è bisogno di reinventare la ruota. – snap

5

Non è esattamente quello che stai chiedendo, ma si possono trovare -S -fverbose-asm utile.

+0

Grazie. Questo è decisamente meglio di -S. Ricevo numeri di linea e alcuni commenti utili che identificano la variabile utilizzata. – philcolbourn

+0

In realtà, non sono sicuro che siano numeri di linea. – philcolbourn

2

è possibile ottenere objdump via macports. basta inserire il pacchetto "binutils" e quindi usare "gobjdump"

+0

Grazie. Ho provato macports e fink. Entrambi sono buoni, ma erano entrambi dolorosi da mantenere. Ho rinunciato a macport e fink favorito. Probabilmente è più semplice eseguire Linux in una VM. – philcolbourn

Problemi correlati