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.
Usa gcc, non ld per il collegamento. –
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
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. –