2009-08-27 2 views
41

objdump जैसे कुछ के साथ मैं कैसे कह सकता हूं, यदि कोई ऑब्जेक्ट फ़ाइल -fPIC के साथ बनाई गई है?अगर मैं ऑब्जेक्ट फ़ाइल -fPIC के साथ बनाया गया है, तो objdump की तरह कुछ के साथ मैं कैसे कह सकता हूं?

+0

संबंधित https://unix.stackexchange.com/questions/89211/test-whether-linux-binary-is-compiled-as-position-independent-code –

उत्तर

48

उत्तर मंच पर निर्भर करता है। सबसे प्लेटफार्मों पर, अगर

readelf --relocs foo.o | egrep '(GOT|PLT|JU?MP_SLOT)' 

से उत्पादन खाली है, तो या तो foo.o-fPIC साथ संकलित नहीं किया गया था, या foo.o जहां -fPIC मामलों किसी भी कोड नहीं है।

+1

मैं अपने पीआईसी/no-पीआईसी वस्तुओं का परीक्षण किया और यह परीक्षण काम नहीं किया। वास्तव में --reloc कुछ भी सूचीबद्ध नहीं है। – teambob

+0

यह परीक्षण एक पीपीसी वास्तुकला पर मेरे लिए काम किया। –

+1

@teambob क्षमा करें, 'objdump'' --relocs' ध्वज नहीं समझता है, 'readelf' करता है। –

8

मुझे यह एक PowerPC लक्ष्य पर यह करना था कि यह पता लगाने के लिए कि कौन सी साझा ऑब्जेक्ट (.so) बिना -पीपीआईसी के बनाया जा रहा था। मैंने जो किया वह पढ़ा गया था -d libMyLib1.so और टेक्स्टट्रेल की तलाश करें। यदि आप टेक्स्टट्रेल देखते हैं, तो एक या अधिक स्रोत फाइलें जो आपके .so को बनाते हैं -fPIC के साथ नहीं बनाए गए थे। आप elfdump के साथ 0-के साथ प्रतिस्थापित कर सकते हैं।

जैसे,

[[email protected] lib]$ readelf -d libMyLib1.so | grep TEXT # Bad, not -fPIC 
0x00000016 (TEXTREL) 
[[email protected] lib]$ readelf -d libMyLib2.so | grep TEXT # Good, -fPIC 
[[email protected] lib]$ 

और त्रुटि जब मैं भागा मेरी निष्पादन यह था मैं हो रही थी लोगों समाधान के लिए खोज में मदद करने के,:

[email protected]:/# ./program: error while loading shared libraries: /usr/lib/libMyLi 
b1.so: R_PPC_REL24 relocation at 0x0fc5987c for symbol 'memcpy' out of range 

मैं नहीं जानता कि इस जानकारी के लिए लागू होता है कि क्या सभी वास्तुकलाओं के लिए।

स्रोत: blogs.oracle.com/rie

0

एक अन्य विकल्प भेद करने के लिए अपने कार्यक्रम बुद्धि -fPIC विकल्प उत्पन्न होता है कि क्या:

अपने कोड -g3 -gdwarf -2 विकल्प सक्षम जब संकलन है कि प्रदान की है।

अन्य जीसीसी डिबग प्रारूप हो सकता है भी मैक्रो जानकारी शामिल हैं:

नोट निम्नलिखित $ '..' वाक्य रचना मान लिया गया है बैश

echo $' main() { printf("%d\\n", \n#ifdef __PIC__\n__PIC__\n#else\n0\n#endif\n); }' | gcc -fPIC -g3 
-gdwarf-2 -o test -x c - 

readelf --debug-dump=macro ./test | grep __PIC__ 

ऐसी पद्धति से काम करता है क्योंकि जीसीसी मैनुअल घोषणा करता है कि -fpic अगर प्रयोग किया जाता है, पीआईसी, अगर -fPIC इस्तेमाल किया 1 को परिभाषित किया गया है, और पीआईसी जाँच GOT वें है द्वारा 2.

ऊपर जवाब है ई बेहतर तरीका। क्योंकि -g3 -gdwarf-2 की पूर्व शर्त मुझे लगता है कि शायद ही कभी इस्तेमाल किया जा रहा है।

2

मुझे लगता है कि आप वास्तव में जानना चाहते हैं कि साझा लाइब्रेरी -fPIC के साथ संकलित ऑब्जेक्ट फ़ाइलों से बना है या नहीं।

जैसा कि पहले से ही बताया गया है, यदि टेक्सट्रेल हैं, तो -एफपीआईसी का उपयोग नहीं किया गया था।

स्कैनफेल नामक एक शानदार टूल है जो आपको प्रतीकों को दिखा सकता है जो .text स्थानान्तरण का कारण बनता है।

अधिक जानकारी HOWTO Locate and Fix .text Relocations TEXTRELs पर मिल सकती है।

1
 
readelf -a *.so | grep Flags 
    Flags:        0x50001007, noreorder, pic, cpic, o32, mips32 

यह अधिकतर समय काम करना चाहिए।

+1

यह बहुत आसान लग रहा है, लेकिन मेरे सामने लाइब्रेरी स्थानापन्न है, इसकी Rrel38pl में बहुत से R_386_JUMP_SLOT प्रविष्टियां हैं, लेकिन ध्वज के लिए 0x0 है। शायद यह केवल mips32 पर काम करता है। – James

1

-fPIC का अर्थ है कि कोड पते में निष्पादित करने में सक्षम होगा जो संकलन के लिए अलग था।

यह करने के लिए, disasambler इस तरह दिखेगा ....

call get_offset_from_compilation_address 
get_offset_from_compilation_address: pop ax 
sub ax, ax , &get_offset_from_compilation_address 

अब कुल्हाड़ी में हम एक ऑफसेट किया है कि हम स्मृति के लिए किसी भी उपयोग करने के लिए जोड़ने की जरूरत है।

load bx, [ax + var_address} 
संबंधित मुद्दे

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