इस समारोह के साथ:सेगमेंट रजिस्टर की व्याख्या कैसे करें x86-64 पर?
mov 1069833(%rip),%rax # 0x2b5c1bf9ef90 <_fini+3250648>
add %fs:0x0,%rax
retq
मैं दूसरे अनुदेश कैसे की व्याख्या और यह पता लगाने क्या RAX को जोड़ा गया था?
इस समारोह के साथ:सेगमेंट रजिस्टर की व्याख्या कैसे करें x86-64 पर?
mov 1069833(%rip),%rax # 0x2b5c1bf9ef90 <_fini+3250648>
add %fs:0x0,%rax
retq
मैं दूसरे अनुदेश कैसे की व्याख्या और यह पता लगाने क्या RAX को जोड़ा गया था?
इस कोड:
mov 1069833(%rip),%rax # 0x2b5c1bf9ef90 <_fini+3250648>
add %fs:0x0,%rax
retq
एक धागे की स्थानीय चर का पता लौटा रहा है। %fs:0x0
टीसीबी (थ्रेड कंट्रोल ब्लॉक) का पता है, और 1069833(%rip)
वैरिएबल से ऑफसेट है, जो कि प्रोग्राम में या प्रोग्राम के लोड समय पर लोड की गई कुछ गतिशील लाइब्रेरी पर रहता है (रनटाइम पर लोड की गई लाइब्रेरीज़) dlopen()
के माध्यम से कुछ अलग कोड की आवश्यकता है)।
यह Ulrich Drepper के TLS document, विशेष रूप से §4.3 और §4.3.6 में बहुत विस्तार से समझाया गया है।
मुझे यकीन नहीं है कि उन्हें सेगमेंट सेगमेंट किए गए आर्किटेक्चर के बुरे पुराने दिनों से पंजीकृत किया गया है। मेरा मानना है कि उचित शब्द एक चयनकर्ता है (लेकिन मैं गलत हो सकता है)।
हालांकि, मुझे लगता है कि आपको fs
क्षेत्र में पहले क्वाडवर्ड (64 बिट्स) की आवश्यकता है।
%fs:0x0
बिट fs:0
पर मेमोरी की सामग्री का मतलब है। चूंकि आपने जेनेरिक add
(उदाहरण के लिए addl
के बजाय) का उपयोग किया है, मुझे लगता है कि यह लक्ष्य %rax
से डेटा चौड़ाई लेगा।
वास्तविक मूल्य प्राप्त करने के मामले में, यह इस बात पर निर्भर करता है कि आप विरासत या लंबे मोड में हैं या नहीं।
विरासत मोड में, आपको fs
मान प्राप्त करना होगा और मूल पता प्राप्त करने के लिए इसे जीडीटी (या संभवतः एलडीटी) में देखना होगा।
लंबे मोड में, आपको प्रासंगिक मॉडल विशिष्ट रजिस्टरों को देखने की आवश्यकता होगी। यदि आप इस बिंदु पर हैं, तो आप दुर्भाग्यवश मेरी विशेषज्ञता के स्तर से आगे बढ़ गए हैं।
मुझे लगा बहुत, लेकिन मैं एक चयनकर्ता से वास्तविक पता कैसे प्राप्त करूं? मेरे पास चलने की प्रक्रिया नहीं है, केवल कोर डंप है। –
मुझे डर है कि मैं लंबे समय में हूं। –
हां, चयनकर्ता इंडेक्स हैं (अन्य चीजों के साथ, जैसे ध्वज जो एलडीटी/जीडीटी को स्मृति से निर्दिष्ट करता है)। आपको पता होना चाहिए कि जीडीटी/एलडीटी कहां है, और मैं _entirely_ निश्चित नहीं हूं कि आप वास्तव में रजिस्टर जानकारी से प्राप्त कर सकते हैं। – paxdiablo
मान लें कि आप लिनक्स के तहत चल रहे हैं, [यह] (http://stackoverflow.com/questions/6611346/amd64-fs-gs-registers-in-linux) प्रश्न प्रासंगिक हो सकता है। – user786653
संभावित डुप्लिकेट [असेंबली में "डीएस: \ [40207 ए \]" का अर्थ क्या है?] (Http://stackoverflow.com/questions/3819699/what-does-ds40207a-mean-in-assembly) –