2013-04-23 14 views
5

Ho una suite di software scritta in "C". Questo è normalmente compilato usando acc ed eseguito su un sistema Solaris UNIX, ma mi è stato dato il compito di farlo funzionare sotto Linux su una casella x86_64.Errore di segmentazione: 0x0000000000000001 in ??() cercando di compilare/link sotto Linux

Non ho molta familiarità con gcc o Linux, ma sono riuscito a compilare il codice con un minimo di modifiche per rimuovere gli avvertimenti che non erano presenti in Solaris. Sto usando il seguente comando di compilazione (invocato da uno script, quindi le variabili d'ambiente):

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

La maggior parte della sorgente viene poi messo in condivisi (.so) librerie, anche tramite script, utilizzando il seguente comando:

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

un makefile di esempio per un eseguibile chiamato 'gsproc' è la seguente:

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 

ho avuto successo nella compilazione e poi collegare tutto il codice eseguibile, ma ogni ora cade immediatamente all'avvio con un errore di segmentazione e core dump. Tutto quello che ricevo da gdb è:

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 ??() 

Quindi non sembra che il problema sia con il codice, in quanto tale. Presumibilmente sto facendo qualcosa di sbagliato con il mio compilatore o opzioni di linker.

+0

Usa gcc, non ld per il collegamento. –

+0

Grazie per il feedback. L'ho preso in considerazione, ma ho pensato che gcc ha appena chiamato ld lo stesso? Ho ereditato una serie di script abbastanza coinvolti che gestiscono la compilazione e la popolazione delle librerie condivise. A seconda del prefisso del file sorgente, gli oggetti devono entrare in diverse librerie, quindi ho cercato di non dover apportare modifiche troppo grandi al meccanismo attuale. Se dovessi popolare la libreria .so tramite gcc, qual è l'opzione della riga di comando da utilizzare? Come faccio a sapere quale libreria deve essere caricato l'oggetto? – user2311565

+0

gcc chiama ld, ma con le opzioni interne applicate che altrimenti mancheresti se si utilizza direttamente ld. Probabilmente dovresti leggere questo: http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html. Sarebbe meglio se tu usassi un vero sistema di build per questo, il che garantirebbe una build corretta. Raccomando CMake (http://www.cmake.org) che ti permette di usare lo stesso sistema di compilazione su tutte le piattaforme. Automake (http://www.gnu.org/software/automake) è un'altra alternativa, che funziona insieme a Autoconf (http://www.gnu.org/software/autoconf). In generale, usa CMake se puoi. –

risposta

0

Questa regola Makefile/comando gcc

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

fa un gsproc oggetto namde condiviso (senza il normale prefisso lib e .so suffisso). Un eseguibile e una libreria sono lo stesso fileformato in molti sistemi operativi, con l'effetto collaterale che si può provare a eseguire una libreria condivisa come un eseguibile. Ma il risultato è solitamente quello che vedi, arresto istantaneo, ecc.