我有一整套用“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 ?? ()
这样看来,问题似乎不在于代码。大概我的编译器或链接器选项做错了。
最佳答案
这个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后缀)。在许多操作系统中,可执行文件和库是相同的文件格式,其副作用是您可以尝试将共享库作为可执行文件运行。但是结果通常是您所看到的,即时崩溃等。