2014-12-20 6 views
5

मैं एक निष्पादन ELF लिखने योग्य के .text खंड बनाने की जरूरत है। कार्यक्रम मैं संशोधित करने की आवश्यकता सी में लिखा है और मैं इसे संकलन कर सकते हैं। कोई विचार?मेक पाठ खंड लिखने योग्य, ELF

धन्यवाद एक बहुत।

+0

पर्याप्त स्पष्ट नहीं है। .text usuaally कोड है। यह आपके सॉफ्टवेयर/फर्मवेयर कहां रखा गया है? – LPs

+0

शायद यह एक डुप्लिकेट है, लेकिन दूसरे प्रश्न में उन्होंने ऐसे समाधान साझा किए जो काम नहीं करते हैं। – Cronovirus

+1

हां मुझे रन टाइम पर कोड संशोधित करने की आवश्यकता है, इसलिए टेक्स्ट सेगमेंट को लिखने योग्य होना चाहिए .. – Cronovirus

उत्तर

8

नीचे जवाब के लिए, मैं इस परीक्षण कार्यक्रम का उपयोग करने के लिए जा रहा हूँ:

#include <stdio.h> 
#include <stdlib.h> 

int 
main (int argc, char **argv) 
{ 
    printf ("Hello world\n"); 
    void *m = main; 
    *((char *) m) = 0; 
    exit (0); 
} 

संकलित साथ:

$ gcc -g -o test test.c 

जैसी उम्मीद थी:

$ gdb test 
... 
(gdb) run 
Starting program: /home/amb/so/test 
Hello world 

Program received signal SIGSEGV, Segmentation fault. 
0x00000000004005a2 in main (argc=1, argv=0x7fffffffe628) at test.c:9 
9  *((char *)m) = 0; 
(gdb) 

स्पष्ट मार्ग यहाँ gcc को -Wl ध्वज का उपयोग करने के -N पारित करने के लिए या है (उर्फ +०१२३६६६१४५) लिंकर को, अर्थात gcc ... -Wl,--omagic ..., हालांकि यह अन्य अवांछनीय परिणाम हो सकते हैं (उदाहरण के लिए साझा पुस्तकालयों को अक्षम करना)। आदमी पृष्ठ से:

-N 
    --omagic 
     Set the text and data sections to be readable and writable. Also, do not page-align the 
     data segment, and disable linking against shared libraries. If the output format 
     supports Unix style magic numbers, mark the output as "OMAGIC". Note: Although a 
     writable text section is allowed for PE-COFF targets, it does not conform to the format 
     specification published by Microsoft. 

की है कि एक जाना देता हूँ:

$ gcc --static -g -Wl,--omagic -o test test.c 
$ ./test 
Hello world 
$ 

कि ठीक काम करता है, लेकिन आप गतिशील पुस्तकालय समर्थन खो दिया है।

गतिशील पुस्तकालय समर्थन रखने के लिए, और एक लिखने योग्य पाठ खंड बना रहे, आप का उपयोग करने के लिए सक्षम होना चाहिए:

objcopy --writable-text ... 

आदमी पृष्ठ से:

--writable-text 
     Mark the output text as writable. This option isn't meaningful for all object file 
     formats. 

यह काम करना चाहिए, लेकिन नहीं करता है 'टी, objdump सत्यापित करेगा। तो यहां एक समाधान है जो --writable-text से थोड़ा आगे हो जाता है, जैसा कि ओपी ने टिप्पणियों में कहा है, यह टिन^वमानपेज पर जो कुछ भी कहता है, वह ऐसा नहीं करता है।

चलो देखते हैं कैसे वर्गों चिह्नित कर रहे हैं:

$ gcc -g -o test test. 
$ objdump -h test | fgrep -A1 .text 
    12 .text   00000192 0000000000400490 0000000000400490 00000490 2**4 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 

आइए अब कि READONLY ध्वज से छुटकारा पाने:

$ objcopy --set-section-flags .text=contents,alloc,load,code test test1 
$ objdump -h test1 | fgrep -A1 .text 
12 .text   00000192 0000000000400490 0000000000400490 00000490 2**4 
        CONTENTS, ALLOC, LOAD, CODE 

और अब READONLY चला गया है, के रूप में अनुरोध किया।

लेकिन:

$ gdb test1 
... 
(gdb) run 
Starting program: /home/amb/so/test1 
Hello world 

Program received signal SIGSEGV, Segmentation fault. 
0x00000000004005a2 in main (argc=1, argv=0x7fffffffe628) at test.c:9 
9  *((char *)m) = 0; 
(gdb) 

मुझे लगता है यहां मुद्दा यह है कि अन्य की तुलना में कुछ और ELF अनुभाग का नाम केवल पढ़ने के लिए जब वास्तव में भरी हुई अनुभाग बना रही है है। शायद यही कारण है कि लोग आपको mprotect का उपयोग करने का सुझाव दे रहे हैं। खेद है कि अधिक मदद नहीं हुई है।

+0

पहले आपके उत्तर के लिए धन्यवाद। लेकिन objcopy काम नहीं करता है और विकल्प-XN मेरे जीसीसी द्वारा मान्यता प्राप्त नहीं है .. – Cronovirus

+0

@ क्रोनोवायरस - अच्छी तरह से, भरोसेमंद विधि (लिंक समय पर उपलब्ध नहीं है) 'mprotect' के साथ अपनी स्मृति सुरक्षा को बदलना होगा। यदि आप स्रोत को नहीं बदल सकते हैं, तो शायद इसे प्राप्त करने के लिए 'LD_PRELOAD' का उपयोग करें। – abligh

+0

धन्यवाद, मुझे mprotect पता है, लेकिन मैं पहले एक स्थिर समाधान की तलाश में था .. – Cronovirus

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