2012-01-11 8 views
7

मैं समझने की कोशिश कर रहा हूं कि मैक-ओ फाइलें कैसे काम करती हैं, और ऑनलाइन संसाधनों के साथ प्रगति का एक अच्छा सौदा किया है (विशेष रूप से, यहां ऐप्पल पेज: http://developer.apple.com/library/mac/#documentation/developertools/conceptual/MachORuntime/Reference/reference.html), लेकिन मैं प्रतीक स्टब्स कैसे काम करते हैं यह समझने के लिए एक रोडब्लॉक मारा है।मैच-ओ प्रतीक स्टब्स (आईओएस)

का उपयोग करना "otool -l" मैं निम्नलिखित खंड देखें:

Section 
    sectname __symbolstub1 
    segname __TEXT 
     addr 0x00005fc0 
     size 0x00000040 
    offset 20416 
    align 2^2 (4) 
    reloff 0 
    nreloc 0 
    flags 0x80000408 

हालांकि जब मैं एक हेक्स संपादक मैं निम्नलिखित 4 बाइट बार-बार दोहराया देखने में बाइनरी फ़ाइल से डेटा को देखने के:

00005FC0 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 88 
00005FD0 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 88 
00005FE0 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 88 
00005FF0 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 88 

यह एक लीडर जो एक निश्चित राशि से पीसी बढ़ जाती तरह दिखता है, लेकिन मैं नहीं दिख रहा है यही कारण है कि राशि प्रतीक तालिका में प्रत्येक प्रविष्टि के लिए एक ही है।

यदि कोई ऐसा प्रकाश डालता है या ऐसा कोई संसाधन प्रदान करता है जो इस निम्न स्तर को प्राप्त करता है, तो कृपया मुझे बताएं।

धन्यवाद!

+0

मुझे लगता है कि मुझे पता चला है कि क्या हो रहा है, तालिका में 4-बाइट प्रविष्टियों में से प्रत्येक नीचे एक डेटा क्षेत्र की ओर इशारा कर रहा है जिसमें एक डीसीडी निर्देश है जो फ़ंक्शन कॉल का स्थान संग्रहीत करता है। हालांकि मैं अभी भी थोड़ा उलझन में हूं क्यों इस अतिरिक्त स्तर पर संकेत की आवश्यकता है, इसलिए अगर कोई भी जानकारी प्रदान कर सकता है तो मैं इसकी सराहना करता हूं। – Locksleyu

उत्तर

12

मैं वर्तमान आईओएस के साथ स्थिति का वर्णन करूंगा, यह पुराने संस्करणों में कुछ अलग है।

प्रतीक स्टब्स वास्तव में पीसी में एक फ़ंक्शन पॉइंटर लोड करते हैं। मानक "सुस्त" (ऑन-डिमांड) आयात के लिए, सूचक __lazy_symbol खंड में रहता है और शुरू में __stub_helper अनुभाग में एक सहायक दिनचर्या को इंगित करता है, जैसे:

__symbolstub1 _AudioServicesAddSystemSoundCompletion 
__symbolstub1 LDR PC, _AudioServicesAddSystemSoundCompletion$lazy_ptr 
__symbolstub1 ; End of function _AudioServicesAddSystemSoundCompletion 

__lazy_symbol _AudioServicesAddSystemSoundCompletion$lazy_ptr DCD _AudioServicesAddSystemSoundCompletion$stubHelper 

__stub_helper _AudioServicesAddSystemSoundCompletion$stubHelper 
__stub_helper LDR R12, =nnn ; symbol info offset in the lazy bind table 
__stub_helper B dyld_stub_binding_helper 

समारोह dyld_stub_binding_helper में मुट्ठी में से एक है __stub_helper अनुभाग और अनिवार्य रूप से dyld_stub_binder कार्य में डाइल्ड में एक ट्रैम्पोलिन है, जिसे मैं "प्रतीक जानकारी ऑफसेट" मान कहता हूं। वह मान आलसी बाध्यकारी जानकारी स्ट्रीम (एलसी_DYLD_INFO या LC_DYLD_INFO_ONLY लोड कमांड द्वारा इंगित) के अंदर एक ऑफ़सेट है, जो कि बाइट कोड के प्रकार के साथ बाइटकोड स्ट्रीम का एक प्रकार है। एक आलसी आयात के लिए विशिष्ट अनुक्रम इस तरह दिखता है:

72: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB(M, 0xYYYYY) 
19: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM(NNNN) 
40: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM(0x00, '_AudioServicesAddSystemSoundCompletion') 
90: BIND_OPCODE_DO_BIND() 
यहाँ

dyld करना होगा निम्नलिखित:

  1. अप समारोह नाम '_AudioServicesAddSystemSoundCompletion' से में सूचीबद्ध dylibs की सूची में एक dylib संख्या NNNN देखो भार आदेश।
  2. निष्पादन योग्य सेगमेंट नंबर एम (सबसे अधिक संभावना __DATA)
  3. ऑफ़सेट YYYYY पर फ़ंक्शन पॉइंटर लिखें।
  4. ऊपर देखा पते पर कूद ताकि वास्तविक समारोह अपना काम

पता _AudioServicesAddSystemSoundCompletion$lazy_ptr स्लॉट होने के लिए लिखा है। तो, अगली बार _AudioServicesAddSystemSoundCompletion कहा जाता है, यह सीधे आयातित फ़ंक्शन पर कूद जाएगा, बिना dyld के जा रहा है।

एनबी।: आपको तुरंत फ़ाइल में ऑफसेट 05fc0 को नहीं देखना चाहिए। addr फ़ील्ड वर्चुअल एड्रेस है, आपको उस सेगमेंट कमांड को देखना चाहिए और देखें कि वीए क्या शुरू होता है और इसकी फाइल ऑफसेट क्या है, फिर गणित करें। आम तौर पर __TEXT सेगमेंट 1000 से शुरू होता है।

हालांकि, वास्तविक प्रतीक स्टब्स आपको चिपकाते हुए दिखते हैं, शायद आपके पास पहले 1000 बाइट्स लेने वाले वसा हेडर के साथ एक वसा माच-ओ है, इसलिए ऑफ़सेट लाइन अप हो जाती है।

+0

+1। धीरे झुकाव, खड़े खड़े हो जाओ। शानदार जवाब। मैंने उससे बहुत कुछ सीखा! – mattjgalloway

+0

वाह, अद्भुत जवाब! मुझे पूरी तरह समझने से पहले इसे कुछ बार पढ़ना होगा, लेकिन इगोर कृपया मुझे एक बात बताएं। आपको यह ज्ञान कहां मिला? सभी प्रासंगिक एएसएम पढ़कर या यह पूरी तरह से कहीं भी दस्तावेज है? धन्यवाद! – Locksleyu

+0

ज्यादातर द्विआधारी से, हां। हालांकि, सिद्धांत रूप में आप इसे स्रोत कोड से भी समझ सकते हैं - देखें [ऐप्पल के स्रोत] (http://opensource.apple.com/source/) dyld, ld64 और csu के लिए। –

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