2015-06-11 11 views
5

मैं एक मैप की गई स्मृति बफर में एक समारोह लोड और आज़माने के लिए उसे बाद में फोन तो मैं कर दिया है, एक परीक्षण मामला कोशिश कर रहा हूँ:प्रतिलिपि बनाई जा रही मौजूदा समारोह

auto func() -> void{ 
    asm(
     "nop;" 
     "nop;" 
     "nop;" 
     "nop;" 
    ); 
} 

auto main(int argc, char *argv[]) -> int{ 
    void *exec_mem = mmap(nullptr, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 
    // check errors here 

    memcpy(exec_mem, reinterpret_cast<const void*>(func), 5); // size is known 
    (reinterpret_cast<void(*)()>(exec_mem))(); // function call 

    munmap(exec_mem, getpagesize()); 
} 

कौन सा ठीक काम करता है, लेकिन जैसे ही मैं कुछ भी छोटा करने की कोशिश करता हूं, मुझे एक सीगफॉल्ट मिलता है। अब मेरे समारोह कॉल segfaults

int x; 
auto func() -> void{ 
    x = 5; 
} 

और:

मैं इस तरह एक साधारण चर काम करने की कोशिश की। मैंने बफर आकार को उचित रूप से बदल दिया है और मुझे यकीन है कि बफर में सही मेमोरी लिखी जा रही है।

मुझे जानकारी का कौन सा महत्वपूर्ण टुकड़ा याद आ रहा है? मैं ऐसा क्यों नहीं कर सकता?

पीएस कृपया मुझे असुरक्षित कोड पर व्याख्यान न दें, यह एक साधारण व्यक्तिगत सीखने का अभ्यास है।

+0

आपको इस तरह के कोड लिखने पर विचार करने के लिए भी अपने काम में बहुत असुरक्षित होना चाहिए। –

+0

@EdHeal हाँ, मैं नौकरी के लिए कार्यक्रम नहीं करता हूं। – CoffeeandCode

+1

बस उत्सुक, यह वाक्यविन्यास क्या है: 'auto/->'? इसे पहले कभी नहीं देखा। –

उत्तर

4

इस तथ्य को अनदेखा करते हुए कि यह वैश्विक अपरिवर्तनीय व्यवहार है, यदि आप वैश्विक चर का असाइनमेंट करते हैं, तो जेनरेट कोड कुछ आर्किटेक्चर पर चर के संदर्भ में relative addressing का उपयोग करने की संभावना है।

यह है कि, फ़ंक्शन स्वयं को और एक्स को किसी दिए गए पते पर होने की उम्मीद करता है, और यदि आप इसे स्थानांतरित करते हैं, तो चीज़ें टूट जाती हैं।

x: 
     .zero 4 
     .text 
     .globl _Z4funcv 
     .type _Z4funcv, @function 
_Z4funcv: 
.LFB2: 
     .cfi_startproc 
     pushq %rbp 
     .cfi_def_cfa_offset 16 
     .cfi_offset 6, -16 
     movq %rsp, %rbp 
     .cfi_def_cfa_register 6 
     movl $5, x(%rip) 
     nop 
     popq %rbp 
     .cfi_def_cfa 7, 8 
     ret 
     .cfi_endproc 

नोट movl $5, x(%rip) है, जो कि कोड x और दुकान 5 की स्थिति की गणना करने के लिए अपने स्वयं के पते (% रिप में संग्रहीत) का उपयोग करता है मतलब है:

यह वही मेरी जीसीसी अपने परीक्षण समारोह के लिए उत्पन्न करता है इस में।

तो संक्षेप में, ऐसा करने का कोई आसान तरीका नहीं है जिसे आप करने का प्रयास कर रहे हैं, जब तक कि आप सुनिश्चित न करें कि आपके फ़ंक्शन में केवल position-independent code है। और फिर भी, यह केवल परेशानी के लिए पूछ रहा है।

+0

क्या आप एक कार्य के लिए जीसीसी को स्थिति स्वतंत्र कोड उत्पन्न करने का एक तरीका जानते हैं? – CoffeeandCode

+1

@CoffeeandCode आप फ़ंक्शन को अपनी फ़ाइल में डाल सकते हैं, और फ़ाइल को संकलित कर सकते हैं -fPIC – tux3

+0

परेशानी की तरह लगता है, अगर मुझे कुछ भी नहीं मिलता है तो मैं इसका सहारा लेगा। उत्तर के लिए धन्यवाद :) मैं शामिल जोखिमों को समझता हूं, लेकिन मुझे वांछित व्यवहार की आवश्यकता है और किसी अन्य परियोजना में ऐसा कुछ भी उपयोग नहीं करेगा। – CoffeeandCode

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