我有一套用“C”编写的软件。这通常使用 acc 编译并在 UNIX Solaris 系统上运行,但我的任务是让它在 x86_64 机器上的 Linux 下运行。
我对 gcc 或 Linux 不是特别熟悉,但我已经设法通过最少的更改来编译代码,以删除在 Solaris 下不存在的警告。我正在使用以下编译命令(从脚本调用,因此是环境变量):
/usr/bin/gcc -L/tmp/lib -L/tmp/usr/lib -c -fPIC -g -I$WORKING_DIR $INCLUDE $WORKING_DIR/$FILE
然后使用以下命令将大部分源代码放置在共享 (.so) 库中,也可以通过脚本:
ld $GLOSS_SUB_DIR/$REL_DIR/obj/$PREFIX*".o" -G -o $GLOSS_SUB_DIR/$REL_DIR/lib/$LIB$NEW_MIN_VER_NO
名为“gsproc”的可执行文件的示例生成文件如下:
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
我已经成功地编译并链接了所有代码,但是现在每个可执行文件在启动时都会立即崩溃,并出现分段错误和核心转储。我从 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 ?? ()
所以看起来问题不在于代码。大概我的编译器或链接器选项有问题。