2010-03-09 14 views
13

Hangi kodun üretildiğini görmek için C kaynak hatlarını derleme çıktısına almak istiyorum.Kaynak satırlarını GCC kullanarak montaj çıktısıyla nasıl alabilirim?

-S-Wa,-ahlms gibi GCC seçeneklerini denedim (ve hatta -Wa,--gstabs 'çünkü onu bir yere okudum).

Oh! BTW, Mac’te çalışıyorum, dolayısıyla objdump’um yok.

Bu sorduğun değil tam olarak ne 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

Yapmak istediğim şey bir Mac üzerinde kolayca yapılamaz. 1) “objdump” yoktur ve “otools” da işi yapmaz. 2) 'gdb' daha yeni sürümlerde' disas/m '- Mac'in daha eski bir gdb'si vardır. 3) 'GCC' nin montajcı çıktısının Mac’e çok yardımcı olmadığından şüpheleniyorum. 4) Neden XCode'u kullanmak zorundayım? (Buna cevap verme). – philcolbourn

+0

Bu sorudan kısa bir süre sonra linux kurdum ve OS-X'den vazgeçtim, ancak Douglas bir çözüme daha yakın görünüyor. – philcolbourn

+0

Eğer kodun küçük bölümlerine bakıyorsanız godbolt (bu yanıtı açıkla) olarak daha basit bir çözüm olabilir (http://stackoverflow.com/a/25781924/1708801). –

cevap

10

Belki bir işlem sonrası adımı hata ayıklama?

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

bul .file 1 "1.c" adı eşleme dosya size dosya numarasını söylemek. Ardından, .loc 1 8 0 satırlarından sonra kaynak ekleyin. Tek bir kabuk komut ile bunu nasıl emin değilim, ama kısa senaryo yapmak mümkün olmalıdır:

#!/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

Teşekkürler. Bu ilginç görünüyor. Ancak, assembler dosyası .file veya .loc ifadeleri içermiyor. Ben derleyiciyi soruya göndereceğim. – philcolbourn

+1

".loc" satırlarını gcc komut satırına "-g" ekleyerek alabilirsiniz. Faydalı bir senaryo için Douglas'a +1: tam olarak aradığım şey. Tekerleği yeniden icat etmeye gerek yok. – snap

5

ait

Çıkışı (Maalesef bu kısa, ben! Trenden almak zorunda), ancak -S -fverbose-asm yararlı bulabilirsiniz.

+0

Teşekkürler. Bu kesinlikle -S'den daha iyidir. Kullanılmakta olan değişkeni tanımlayan satır numaraları ve bazı faydalı yorumlar alıyorum. – philcolbourn

+0

Aslında, onların satır numaraları olduğundan emin değilim. – philcolbourn

2

Eğer MacPorts aracılığıyla objdump alabilirsiniz. Sadece "binutils" paketini intalleyin ve sonra "gobjdump" öğesini kullanın.

+0

Teşekkürler. Macports ve fink denedim. Her ikisi de iyidir, ama ikisi de korumak için acı vericiydi. Macports'tan vazgeçtim ve fink tercih ettim. Bir VM'de linux çalıştırmak daha kolay. – philcolbourn