6

我有一套用“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 ?? ()

所以看起来问题不在于代码。大概我的编译器或链接器选项有问题。

4

1 回答 1

1

这个 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 后缀)。在许多操作系统中,可执行文件和库是相同的文件格式,其副作用是您可以尝试将共享库作为可执行文件运行。但结果通常是你所看到的,即时崩溃等。

于 2017-03-28T07:14:37.500 回答