2015-01-23 13 views
12

परीक्षण उबंटू 12.04 64-बिट पर है। x86 वास्तुकला।पीआईई, पीआईसी कोड और 64-बिट x86 प्लेटफॉर्म पर निष्पादन योग्य तुलना में अंतर क्या हैं?

मैं अवधारणा स्थिति स्वतंत्र निष्पादन योग्य (पीआईई) और स्थिति स्वतंत्र कोड (पीआईसी) की अवधारणा के बारे में उलझन में हूं, और मुझे लगता है कि वे ऑर्थोगोनल नहीं हैं।

मेरा त्वरित प्रयोग यहां है।

gcc -fPIC -pie quickSort.c -o a_pie.out 
gcc -fPIC  quickSort.c -o a_pic.out 
gcc       a.out 

objdump -Dr -j .text a.out > a1.temp 
objdump -Dr -j .text a_pic.out > a2.temp 
objdump -Dr -j .text a_pie.out > a3.temp 

और मेरे पास निम्नलिखित निष्कर्ष हैं।

a.out कुछ पीआईसी कोड शामिल है, लेकिन केवल libc प्रस्तावना और उपसंहार कार्यों में तैयार नहीं है, के रूप में नीचे में दिखाया गया है:

4004d0:  48 83 3d 70 09 20 00 cmpq $0x0,0x200970(%rip)  # 600e48 <__JCR_END__> 

मेरी सरल quicksort कार्यक्रम के विधानसभा निर्देश में , मुझे कोई भी पीआईसी निर्देश नहीं मिला।

बी a_pic.out पीआईसी कोड होता है, और मैं किसी भी गैर पीआईसी निर्देश ... मेरी quicksort कार्यक्रम के निर्देश में नहीं मिला, सभी वैश्विक डेटा इस तरह पीआईसी निर्देश द्वारा पहुँचा रहे हैं :

40053b:  48 8d 05 ea 02 00 00 lea 0x2ea(%rip),%rax  # 40082c <_IO_stdin_used+0x4> 

सी a_pie.out a_pic.out के साथ तुलना वाक्य रचना-समान निर्देश शामिल हैं। हालांकि, a_pie.out के के स्मृति पते .text अनुभाग 0x630 से 0xa57 तक है, जबकि a_pic.out का एक ही भाग 0x400410 से 0x400817 तक है।

क्या कोई मुझे इन घटनाओं के बारे में कुछ स्पष्टीकरण दे सकता है? विशेष रूप से खोज सी। फिर से, मैं पाई बनाम पीआईसी के बारे में वास्तव में उलझन में हूँ, और पता नहीं कैसे खोजने सी समझाना पड़ेगा ..

+1

असल में 'पीआईई' एक्जिक्यूटिव के लिए लक्षित है और साझा पुस्तकालयों के लिए 'पीआईसी' है। यह 'पीआईसी' निष्पादन योग्य जांचने के लिए ज्यादा समझ में नहीं आता है। यह भी ध्यान रखें कि 'gcc' तदनुसार लिंकर को आमंत्रित करता है। – Jester

उत्तर

14

मैं अवधारणा स्थिति स्वतंत्र निष्पादन योग्य (PIE) और स्थिति स्वतंत्र कोड के बारे में उलझन में हूँ (पीआईसी), और मुझे लगता है कि वे ऑर्थोगोनल नहीं हैं।

PIE और PIC के बीच केवल वास्तविक अंतर यह है कि आप करने की अनुमति है PIC में प्रतीकों लगाना, लेकिन PIE में नहीं है। इसके अलावा, वे काफी समकक्ष हैं।

आप प्रतीक इंटरपोजिशन here के बारे में पढ़ सकते हैं।

सी a_pie.out में an_pic.out की तुलना में वाक्यविन्यास-समान निर्देश शामिल हैं। हालांकि, a_pie.out के .text खंड के मेमोरी पते 0x630 से 0xa57 तक हैं, जबकि a_pic.out का एक ही भाग 0x400410 से 0x400817 तक है।

यह समझना मुश्किल है कि आपको इसके बारे में आश्चर्यजनक क्या लगता है।

PIE बाइनरी एक साझा लाइब्रेरी के रूप में जुड़ा हुआ है, और इसलिए इसका डिफ़ॉल्ट लोड पता (पहले LOAD सेगमेंट के .p_vaddr) शून्य है। उम्मीद है कि कुछ इस बाइनरी को शून्य पृष्ठ से दूर स्थानांतरित कर देगा, और इसे कुछ यादृच्छिक पते पर लोड करेगा।

दूसरी ओर, गैर-PIE निष्पादन योग्य हमेशा इसके लिंक किए गए पते पर लोड किया गया है। लिनक्स पर, x86_64 बाइनरी के लिए डिफ़ॉल्ट पता 0x400000 है, और इसलिए .text वहां से बहुत दूर नहीं होता है।

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