2011-07-13 7 views
19

जब मैं अपने छोटे समारोह एकत्रित न, मैं इस कॉल__i686.get_pc_thunk.bx क्या है? हमें इस कॉल की आवश्यकता क्यों है?

call 0xf60d2f47 <__i686.get_pc_thunk.bx>. 

मैं कोई सुराग नहीं क्यों मैं अपने कार्यक्रम में इस कॉल की जरूरत है देखने के लिए हुआ है। कोई स्पष्टीकरण सहायक होगा।

उत्तर

33

यह कॉल x86 पर स्थिति-स्वतंत्र कोड में उपयोग किया जाता है। यह %ebx रजिस्टर में कोड की स्थिति लोड करता है, जो वैश्विक ऑब्जेक्ट्स (जो कोड से एक निश्चित ऑफसेट है) को उस रजिस्टर से ऑफसेट के रूप में एक्सेस करने की अनुमति देता है।

स्थिति-स्वतंत्र कोड कोड है जिसे अलग-अलग पते पर लोड और निष्पादित, अनमोडिफाइड किया जा सकता है। कोड के लिए यह महत्वपूर्ण है जो साझा पुस्तकालयों में जोड़ा जाएगा, क्योंकि इन्हें विभिन्न प्रक्रियाओं में एक अलग पते पर मैप किया जा सकता है। एक बराबर कॉल नहीं, x86-64 पर की आवश्यकता है क्योंकि कि वास्तुकला आईपी रिश्तेदार को संबोधित मोड हैं (जो है, यह सीधे एक वर्तमान शिक्षा का स्थान से ऑफसेट के रूप में स्मृति स्थल के पता कर सकते हैं) है

ध्यान दें कि।

+2

मैं मानता हूँ, वहाँ एक ही बारे में अधिक जानकारी प्राप्त करने के लिए किसी भी अच्छे संबंध है? – Thangaraj

3

उदाहरण के द्वारा जानकारी के लिए और अधिक जोड़ना:

0x012c17a3 <startup+7>:  call 0x12b2ce7 <__i686.get_pc_thunk.bx> 
0x012c17a8 <startup+12>:  add $0x10d6518,%ebx 

फिर बाद आप __i686.get_pc_thunk कहा जाता है:

आप समारोह स्टार्टअप अंदर gdb पर disass कर के बाद मान लीजिए, तो आप कुछ इस तरह मिल जाएगा .bx, रजिस्टर ebx मूल्य 0x012c17a8 द्वारा पॉप्युलेट किया जाएगा, जो अगले निर्देश का पता है।

आप फ़ंक्शन को get_pc (प्रोग्राम काउंटर) के रूप में पढ़ सकते हैं।

मैं इस लेख बेहतर समझ के लिए बहुत अच्छा पाया:

https://www.technovelty.org/linux/plt-and-got-the-key-to-code-sharing-and-dynamic-libraries.html