2012-12-21 60 views
5

के साथ जुड़ा हुआ नहीं चल सकता मैं निम्न आदेश के साथ मेरी हैलो दुनिया कोडांतरण हूँ:निष्पादन libc

nasm -f elf64 test.asm

मैं तो इस के साथ लिंक:

ld -s test.o -lc

मैं इस काम करता है पता क्योंकि file a.out मुझे दिखाता है

a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), stripped

हालांकि जब मैं ./a.out के साथ इस चलाने मैं जब libc बिना लिंक यह ठीक चलाता bash: ./a.out: No such file or directory

प्राप्त करें! मैं अपने libc जुड़े exe को चलाने के लिए कैसे प्राप्त कर सकता हूं?

उत्तर

10

तत्काल समस्या यह है कि ld डिफ़ॉल्ट रूप से दुभाषिए के रूप में /lib/ld64.so.1 उपयोग करता है और आपको लगता है कि गायब हो सकता है (यह /lib64/ld-linux-x86-64.so.2 करने के लिए एक सिमलिंक हो सकता है या जो कुछ भी उचित है) है:

$ readelf -l a.out | grep interpreter 
     [Requesting program interpreter: /lib/ld64.so.1] 
$ ls -l /lib/ld64.so.1 
ls: cannot access /lib/ld64.so.1: No such file or directory 

आप सेट करके ऐसा काम कर सकते हैं स्पष्ट रूप से अपने ld मंगलाचरण के लिए -dynamic-linker /lib64/ld-linux-x86-64.so.2 विकल्प पास करके दुभाषिया:

$ ld -s -dynamic-linker /lib64/ld-linux-x86-64.so.2 test.o -lc 
$ readelf -l a.out | grep interpreter 
     [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] 
$ ./a.out 
$ 

अंगूठे का सरल नियम लेकिन उपयोग करने के लिए gcc च है या यदि आपको libc की आवश्यकता है तो लिंक करना, यह आपके लिए सबकुछ सही करेगा। यह भी सुनिश्चित करें कि आप प्रविष्टि बिंदु के रूप में main का उपयोग करें ताकि सामान्य libc स्टार्टअप कोड में प्रारंभ करने का मौका हो। इसी प्रकार, अंत में बस अपने main से वापस आएं और सीधे exit सिस्कल का उपयोग न करें (यदि आप वास्तव में चाहते हैं तो आप libc से exit फ़ंक्शन का उपयोग कर सकते हैं)। सामान्य रूप से, सिस्कोल का उपयोग करने की अनुशंसा नहीं की जाती है।

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

  • कोई संबंधित समस्या नहीं^_^