2013-04-23 7 views
5

के तहत संकलित/लिंक करने का प्रयास कर रहा है मेरे पास 'सी' में लिखा गया सॉफ़्टवेयर का एक सूट है। यह आमतौर पर एएनआईक्स सोलारिस सिस्टम पर एसी का उपयोग करके संकलित किया जाता है लेकिन मुझे इसे x86_64 बॉक्स पर लिनक्स के तहत चलाने का कार्य दिया गया है।सेगमेंटेशन गलती: 0x0000000000000001 में ??() लिनक्स

मैं विशेष रूप से जीसीसी या लिनक्स से परिचित नहीं हूं लेकिन मैंने सोलारिस के तहत चेतावनी को हटाने के लिए केवल कुछ बदलावों के साथ संकलन करने में कामयाब रहा है। मैं निम्नलिखित संकलन आदेश (एक स्क्रिप्ट से लागू है, इसलिए वातावरण चर) का उपयोग कर रहा:

/usr/bin/gcc -L/tmp/lib -L/tmp/usr/lib -c -fPIC -g -I$WORKING_DIR $INCLUDE $WORKING_DIR/$FILE 

स्रोत से अधिकांश तो साझा (.so) पुस्तकालयों में रखा गया है, यह भी स्क्रिप्ट के माध्यम से, निम्न आदेश का उपयोग कर:

CONTROL_NO = $(shell awk 'BEGIN{FS=","} /control/ {printf "%s%s", $$3,$$4} END{}' $$GLOSS_DIR/subenv_list) 

CTRL_PATH = $(GLOSS_DIR)/control/$(CONTROL_NO) 

OBJECTS = $(CTRL_PATH)/nolib/gsproc.o \ 
      $(CTRL_PATH)/nolib/w_bkg_shared.o 

LIBS = -lcontrolw \ 
      -lsharew \ 
      -lsybdb64 


gsproc: $(OBJECTS) 
    gcc -shared -fPIC -o $(TMP_DIR)/gsproc \ 
     -L $(SYBASE)/$(SYBASE_OCS)/devlib \ 
      $(OBJECTS) $(LIBS) -lm -lc –lnsl 

मैं संकलन और उसके बाद कोड के सभी को जोड़ने लेकिन हर निष्पादन अब में सफल रहे हैं:

ld $GLOSS_SUB_DIR/$REL_DIR/obj/$PREFIX*".o" -G -o $GLOSS_SUB_DIR/$REL_DIR/lib/$LIB$NEW_MIN_VER_NO 

एक निष्पादन योग्य 'gsproc' कहा जाता है के लिए एक नमूना makefile इस प्रकार है सेगमेंटेशन गलती और कोर डंप के साथ स्टार्टअप पर तुरंत गिरता है। मैं जीडीबी से प्राप्त करता हूं:

GNU gdb (GDB) Red Hat Enterprise Linux (7.2-50.el6) 
Copyright (C) 2010 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-redhat-linux-gnu". 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>... 
Reading symbols from /gloss_env/GLSLAZ_TST2/control/C2.0.0/bin/gsproc...done. 
(gdb) run 
Starting program: /gloss_env/GLSLAZ_TST2/control/C2.0.0/bin/gsproc 

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000000001 in ??() 

तो ऐसा लगता है कि इस तरह की समस्या कोड के साथ नहीं है। संभवतः मैं अपने कंपाइलर या लिंकर विकल्पों के साथ कुछ गलत कर रहा हूं।

+0

लिंकिंग के लिए एलडी नहीं, जीसीसी का प्रयोग करें। –

+0

प्रतिक्रिया के लिए धन्यवाद। मैंने उस पर विचार किया लेकिन मैंने सोचा कि जीसीसी बस एलडी को बुलाता है? मुझे स्क्रिप्ट्स का एक काफी शामिल सेट मिला है जो साझा पुस्तकालयों के संकलन और आबादी को संभालता है। स्रोत फ़ाइल पर उपसर्ग के आधार पर वस्तुओं को विभिन्न पुस्तकालयों में जाना होता है, इसलिए मैं वर्तमान तंत्र में बहुत बड़ा परिवर्तन करने की कोशिश नहीं कर रहा था। यदि मैं gcc के माध्यम से .so लाइब्रेरी को पॉप्युलेट करना चाहता था, तो कमांड लाइन विकल्प का उपयोग करने के लिए क्या है? मैं यह कैसे कहूं कि ऑब्जेक्ट को किस पुस्तकालय में लोड करने की आवश्यकता है? – user2311565

+0

जीसीसी एलडी कॉल करता है, लेकिन आंतरिक विकल्पों के साथ लागू होता है कि अगर आप सीधे एलडी का उपयोग करते हैं तो आप अन्यथा गायब हैं। आपको शायद इसे पढ़ना चाहिए: http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html। यह सबसे अच्छा होगा यदि आपने इसके लिए वास्तविक निर्माण प्रणाली का उपयोग किया था, जो सही निर्माण सुनिश्चित करेगा। मैं सीएमके (http://www.cmake.org) की अनुशंसा करता हूं जो आपको सभी प्लेटफार्मों पर एक ही निर्माण प्रणाली का उपयोग करने की अनुमति देता है। Automake (http://www.gnu.org/software/automake) एक और विकल्प है, जो Autoconf (http://www.gnu.org/software/autoconf) के साथ मिलकर काम करता है। सामान्य रूप से, यदि आप कर सकते हैं तो सीएमके का उपयोग करें। –

उत्तर

0

यह Makefile नियम/जीसीसी आदेश

gsproc: $(OBJECTS) 
    gcc -shared -fPIC -o $(TMP_DIR)/gsproc \ 
     -L $(SYBASE)/$(SYBASE_OCS)/devlib \ 
      $(OBJECTS) $(LIBS) -lm -lc –lnsl 

एक साझा वस्तु namde gsproc (सामान्य lib उपसर्ग और प्रत्यय .so के बिना) बनाता है। एक निष्पादन योग्य और लाइब्रेरी एक ही फाइलफॉर्मैट है जो कई ऑपरेटिंग सिस्टमों में होती है, साइड-इफेक्ट के साथ कि आप साझा-लाइब्रेरी को निष्पादन योग्य के रूप में चलाने का प्रयास कर सकते हैं। लेकिन परिणाम आमतौर पर आप देखते हैं, तत्काल दुर्घटना आदि

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