मैं इसके साथ दीवार में अपना सिर पीट रहा हूं।
मेरी परियोजना में, जब मैं mmap
मैपिंग के साथ मेमोरी आवंटित कर रहा हूं ( /proc/self/maps
) दिखाता है कि यह केवल पढ़ने योग्य मेमोरी का अनुरोध करने के बावजूद एक पठनीय और निष्पादन योग्य क्षेत्र है ।
स्ट्रेस (जो अच्छा लग रहा था) और अन्य डिबगिंग में देखने के बाद, मैं इस अजीब समस्या से बचने के लिए केवल एक चीज की पहचान करने में सक्षम था: प्रोजेक्ट से असेंबली फ़ाइलों को हटाने और केवल शुद्ध सी (क्या ?!)
तो यहाँ मेरा अजीब उदाहरण है, मैं Ubunbtu 19.04 और डिफ़ॉल्ट gcc पर काम कर रहा हूँ।
यदि आप ASM फ़ाइल के साथ निष्पादन योग्य लक्ष्य को संकलित करते हैं (जो खाली है) तो mmap
एक पठनीय और निष्पादन योग्य क्षेत्र देता है, यदि आप बिना निर्माण करते हैं तो यह सही व्यवहार करता है। इसका आउटपुट देखें, /proc/self/maps
जिसे मैंने अपने उदाहरण में एम्बेड किया है।
example.c
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
int main()
{
void* p;
p = mmap(NULL, 8192,PROT_READ,MAP_ANONYMOUS|MAP_PRIVATE,-1,0);
{
FILE *f;
char line[512], s_search[17];
snprintf(s_search,16,"%lx",(long)p);
f = fopen("/proc/self/maps","r");
while (fgets(line,512,f))
{
if (strstr(line,s_search)) fputs(line,stderr);
}
fclose(f);
}
return 0;
}
example.s : एक खाली फ़ाइल है!
आउटपुट
ASM के साथ संस्करण भी शामिल है
VirtualBox:~/mechanics/build$ gcc example.c example.s -o example && ./example
7f78d6e08000-7f78d6e0a000 r-xp 00000000 00:00 0
ASM के बिना संस्करण शामिल है
VirtualBox:~/mechanics/build$ gcc example.c -o example && ./example
7f1569296000-7f1569298000 r--p 00000000 00:00 0
-Wa,--noexecstack
।