我有一套用'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'的可执行文件的示例makefile如下:
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 ?? ()
所以问题看起来不像代码那样。据推测,我的编译器或链接器选项出错了。
答案 0 :(得分:0)
此Makefile规则/ gcc命令
gsproc: $(OBJECTS)
gcc -shared -fPIC -o $(TMP_DIR)/gsproc \
-L $(SYBASE)/$(SYBASE_OCS)/devlib \
$(OBJECTS) $(LIBS) -lm -lc –lnsl
创建一个共享对象namde gsproc(没有普通的lib前缀和.so后缀)。在许多操作系统中,可执行文件和库是相同的文件格式,副作用是您可以尝试将共享库作为可执行文件运行。但结果通常是你看到的,即时崩溃等。