2010-03-09 18 views
13

मैं यह देखने के लिए कि कौन सा कोड उत्पन्न किया जा रहा है, मैं असेंबली आउटपुट के साथ सी स्रोत लाइन इनलाइन प्राप्त करना चाहता हूं।जीसीसी का उपयोग करके असेंबली आउटपुट के साथ स्रोत लाइन इनलाइन कैसे प्राप्त कर सकता हूं?

मैंने -S-Wa,-ahlms (और यहां तक ​​कि -Wa,--gstabs 'कारण जीसीसी विकल्प की कोशिश की है क्योंकि मैंने इसे कहीं पढ़ा है)।

ओह! बीटीडब्ल्यू, मैं मैक पर हूं इसलिए मेरे पास 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: 
+0

ऐसा लगता है कि मैं जो करना चाहता हूं उसे मैक पर आसानी से नहीं किया जा सकता है। 1) कोई 'ओब्जडम्प' नहीं है और 'ओटोल्स' नौकरी भी नहीं करता है। 2) नए संस्करणों में 'gdb' में' disas/m 'है - मैक में पुराना' gdb' है। 3) मुझे संदेह है कि मैक पर 'जीसीसी' का असेंबलर आउटपुट बहुत उपयोगी नहीं है। 4) मुझे 'एक्सकोड' का उपयोग करने के लिए मजबूर क्यों किया जाना चाहिए? (उसको जवाब न दें)। – philcolbourn

+0

इस प्रश्न के तुरंत बाद मैंने लिनक्स स्थापित किया और ओएस-एक्स पर छोड़ दिया, लेकिन डगलस एक समाधान के करीब प्रतीत होता है। – philcolbourn

+0

यदि आप कोड गोडबॉल्ट के छोटे हिस्सों को देख रहे हैं तो यह एक आसान समाधान हो सकता है क्योंकि मैं [इस उत्तर में समझाता हूं] (http://stackoverflow.com/a/25781924/1708801)। –

उत्तर

10

शायद डीबग + एक पोस्ट-प्रोसेस चरण?

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

खोजें .file 1 "1.c" आप नाम मानचित्रण फाइल करने के लिए फ़ाइल संख्या बताने के लिए। फिर .loc 1 8 0 लाइनों के बाद स्रोत जोड़ें। मैं कैसे एक भी शेल कमांड के साथ यह करने के लिए यकीन नहीं है, लेकिन एक छोटी स्क्रिप्ट यह करने के लिए सक्षम होना चाहिए:

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

धन्यवाद। यह दिलचस्प लग रहा है। हालांकि असेंबलर फ़ाइल में .file और न ही .loc कथन शामिल नहीं है। मैं सवाल में असेंबलर पोस्ट करूंगा। – philcolbourn

+1

आप gcc कमांड लाइन में "-g" जोड़कर ".loc" पंक्तियां प्राप्त कर सकते हैं। उपयोगी स्क्रिप्ट के लिए डगलस को +1: बिल्कुल वही जो मैं ढूंढ रहा था। पहिया को फिर से शुरू करने की कोई ज़रूरत नहीं है। – snap

5

यह वास्तव में क्या आप के लिए पूछ रहे हैं नहीं कर रहा है के उत्पादन, लेकिन आप -S -fverbose-asm उपयोगी मिल सकता है।

+0

धन्यवाद। यह निश्चित रूप से एसएस से बेहतर है। मुझे लाइन नंबर और कुछ उपयोगी टिप्पणियां मिलती हैं जिन्हें वेरिएबल इस्तेमाल किया जा रहा है। – philcolbourn

+0

असल में, मुझे यकीन नहीं है कि वे लाइन नंबर हैं। – philcolbourn

2

आप macports के माध्यम से objdump मिल सकती है। बस "binutils" पैकेज को इंटेल करें और फिर "gobjdump"

+0

धन्यवाद। मैंने मैकपोर्ट्स और फिंक की कोशिश की है। दोनों अच्छे हैं, लेकिन वे दोनों बनाए रखने के लिए दर्दनाक थे। मैंने मैकपोर्ट्स और पसंदीदा फिंक पर छोड़ दिया। एक वीएम में लिनक्स चलाने के लिए शायद आसान है। – philcolbourn

संबंधित मुद्दे