मैं एक मैप की गई स्मृति बफर में एक समारोह लोड और आज़माने के लिए उसे बाद में फोन तो मैं कर दिया है, एक परीक्षण मामला कोशिश कर रहा हूँ:प्रतिलिपि बनाई जा रही मौजूदा समारोह
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;
}
और:
मैं इस तरह एक साधारण चर काम करने की कोशिश की। मैंने बफर आकार को उचित रूप से बदल दिया है और मुझे यकीन है कि बफर में सही मेमोरी लिखी जा रही है।
मुझे जानकारी का कौन सा महत्वपूर्ण टुकड़ा याद आ रहा है? मैं ऐसा क्यों नहीं कर सकता?
पीएस कृपया मुझे असुरक्षित कोड पर व्याख्यान न दें, यह एक साधारण व्यक्तिगत सीखने का अभ्यास है।
आपको इस तरह के कोड लिखने पर विचार करने के लिए भी अपने काम में बहुत असुरक्षित होना चाहिए। –
@EdHeal हाँ, मैं नौकरी के लिए कार्यक्रम नहीं करता हूं। – CoffeeandCode
बस उत्सुक, यह वाक्यविन्यास क्या है: 'auto/->'? इसे पहले कभी नहीं देखा। –