2010-09-10 9 views
9

मैं एक लिनक्स सिस्टम (सेंटोस 5.4 सटीक होने पर) में सी प्रोग्राम में रनटाइम पर x86-64 कोड उत्पन्न कर रहा हूं।जीसीसी - बीएसएस में कोड लिखना और निष्पादित करना - अनुमति ध्वज सेट करना

मैं नीचे के रूप में

char program[1024 * 1024] __attribute__((aligned (16))); 

से पता चला और उसके बाद एक समारोह सूचक के माध्यम से इसे में फोन एक वैश्विक सरणी में मेरी bytecodes उत्पन्न करते हैं।

मेरे मुद्दा है, जब मैं इस

gcc -std=gnu99 parse.c -o parse -lm 

मैं एक SIGSEGV, जो मैं surmising कर रहा हूँ, निष्पादन योग्य के रूप में स्थापित नहीं किया जा रहा बीएसएस खंड की वजह से है मिल की तरह कार्यक्रम संकलन के रूप में pmap द्वारा दिखाए गए

0000000000601000  4K rw--- /data/work/tmp/parse 
0000000000602000 1024K rw--- [ anon ] 

जब मैं इसे इस तरह संकलन,

gcc -std=gnu99 parse.c empty.s -o parse -lm 

रनटाइम के दौरान (empty.s एक शून्य लंबाई फ़ाइल है) , बीएसएस अनुभागों में जादुई रूप से निष्पादन बिट सेट होता है, और सब कुछ बहुत अच्छा काम करता है।

0000000000601000  4K rwx-- /data/work/tmp/parse 
0000000000602000 1024K rwx-- [ anon ] 

तो, इन झंडे को ईएलएफ में कैसे स्थापित किया जाए? और क्या आरडब्ल्यूएक्स अनुमतियों के साथ एक बीएसएस अनुभाग प्राप्त करने के लिए एक विश्वसनीय, सही तरीका है?

अधिक जानकारी - सॉफ्टवेयर संस्करणों

जीसीसी संस्करण 4.1.2 20,080,704 (रेड हैट 4.1.2-48)
लिनक्स 2.6.18-164.15.1.el5 x86_64 जीएनयू/लिनक्स

ठनक

अपडेट - पहले मैंने सोचा कि मैं इस समस्या को हल करने के लिए एमएमएपी का उपयोग नहीं कर सकता क्योंकि कैफ ने सुझाव दिया था, क्योंकि एमएमएपी मुझे उन पृष्ठों को वापस दे रहा था जो बहुत दूर थे (मैं रिश्तेदार एड्रेसिंग के साथ पास के कोड में कूदना चाहता था)। यह पता चला है कि आप एमएमएपी से यह आपके लिए ख्याल रखने के लिए कह सकते हैं, जैसे - एमएपी_32 बीआईटी आपको पहले 2 जीबी में एक पेज वापस देगी।

char* program = mmap(0, 1024 * 1024, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_32BIT | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 
+0

क्या आपको पता चला कि .bss को निष्पादित बिट सेट क्यों है? – cojocar

उत्तर

1

आप शायद बस सीधे अनुरोध एक लिखने योग्य, mmap() के साथ निष्पादन योग्य गुमनाम मानचित्रण अपने उत्पन्न मशीन कोड स्टोर करने के लिए करना चाहिए।

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