2015-10-19 3 views
5

लिनक्स पर इन दोनों आदेशों हैं:objcopy और dsymutil के बीच क्या अंतर है?

objcopy --only-keep-debug foo foo.dbg 
objcopy --add-gnu-debuglink=foo.dbg foo 

इस अर्थ में कि,

  1. यह एक स्टैंडअलोन डिबग जानकारी फ़ाइल बनाता में मैक

    dsymutil <binary> -o <binary>.dSYM 
    

    समतुल्य पर नीचे के बराबर है।

  2. यह निष्पादन योग्य और डीबग जानकारी फ़ाइल के बीच एक लिंक बनाते हैं। मैक

    पर
    strip -S <binary> 
    
    नीचे करने के लिए

    objcopy --strip-debug foo 
    

    या

    strip -g <binary> 
    

    बराबर:

फिर

अलग करना के लिए

लिनक्स पर आदेशों है

उत्तर

2

--only-keep-debug objcopy का हिस्सा कार्यात्मक रूप से dsymutil के समान काम करता है।

डीएसवाईएम में बाइनरी स्थान रिकॉर्ड करने के लिए कोई उपकरण नहीं है। इसके बजाय dSYM & द्विआधारी साझा एक सामान्य यूयूआईडी है, और क्लाइंट जो प्रतीक फ़ाइलों को ढूंढना चाहते हैं, डीबगसिम्बोल्स फ्रेमवर्क का उपयोग करते हैं, जो विभिन्न चालों का उपयोग करता है (उदाहरण के लिए स्पॉटलाइट आयातक, खोज पथ, "डीएसवाईएम बाहरी स्क्रिप्ट ढूंढना" आदि) अलग डीबग फ़ाइल। तो --add-gnu-debuglink के बराबर की आवश्यकता नहीं है।

strip -S का मैक संस्करण स्ट्रिप डीबग जानकारी उसी तरह से करता है जैसे binutils संस्करण करता है। अंतर यह है कि ओएस एक्स पर strip -S वास्तव में बाइनरी के आकार को कम नहीं करेगा। ओएस एक्स पर, डीबग जानकारी हमेशा निष्पादन योग्य से बाहर रखी जाती है - या तो .o फाइलों में या डीएसवाईएम में रहती है। निष्पादन योग्य में केवल एक छोटा "डीबग मैप" होता है जो lldb या dsymutil को बताता है कि .o फ़ाइलों से बौने को कैसे लिंक करें। strip -S केवल डीबग मानचित्र को हटाना है।

+0

1. मैक ओएसएक्स पर डीएसवाईएम और बाइनरी के बीच लिंकिंग कैसे होती है? 2. क्या इसका मतलब है .o फ़ाइलों को भी dsymutil पास करने की जरूरत है? –

+0

नहीं, dsymutil निष्पादन योग्य से "डीबग मानचित्र" पढ़ता है, जो सभी .o फ़ाइलों के स्थान की सूची देता है। इसका मतलब यह है कि आपके पास .o फाइलें उनके मूल स्थान पर हैं और बाइनरी को नहीं हटाया है जिसे आप dsymutil चालू करना चाहते हैं। ऐसा लगता है कि .o फ़ाइलों को dsymutil चलाने के लिए क्या नहीं पता लगाने की सुविधा के लिए एक स्वीकार्य व्यापार-बंद लगता है ... –

+0

मुझे लगता है कि मैंने अभी जवाब दिया # 2। # 1 के लिए के रूप में। संक्षेप में "बाइनरी पर dsymutil चलकर"। चूंकि बाइनरी जानता है कि .o फाइलें कहां हैं (डीबग मैप से) आपको केवल बाइनरी के पथ को डिस्मुटिल प्रदान करने की आवश्यकता है, यह सबकुछ करेगा। यदि आप डिस्मुटिल कैसे काम करते हैं, इस बारे में विवरण चाहते हैं, तो ध्यान दें कि एक्सकोड 7.0 में हमने dsymutil के एक आंतरिक संस्करण से स्विच किया है जो एक एलएलवीएम स्रोत बेस में लागू किया गया है। तो आप पूरी कहानी प्राप्त करने के लिए llvm/tools/dsymutil में स्रोतों को पढ़ सकते हैं। –

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