我是一个Unix / Linux新手,他试图运行一个由没有留下任何文档并且已经解散的人编写的shell脚本。该脚本包含行:
./search $opt1 $arg1 < $poly 2>&1 | tee $output
正在尝试获取文件$poly
并调用程序./search
并将输出转移到$output
。
当我到达这一行时,我会收到消息:./search: cannot execute binary file: Exec format error
search
是一个从脚本调用的C程序,与该项目中的各种其他C程序位于同一文件夹中。脚本和C程序是在不再可用的Unix / Linux盒子上开发和最初执行的,因此我被要求尝试恢复此项目,但在Windows下使用NetBeans中的gcc
和cygwin
。
消息:./search: cannot execute binary file: Exec format error
最有可能与search
没有可执行文件的事实有关。当我尝试构建C程序时,我得到以下输出:
C:\cygwin64\bin\make.exe -f Makefile
gcc -ansi -g -c cbuild.c
gcc -ansi -g -c complex.c
gcc -ansi -g -c mylib.c
gcc -ansi -g -c poly.c
gcc -ansi -g -c real.c
gcc -ansi -g -c zero.c
gcc -lgmp -lm -lrt -o cbuild cbuild.o complex.o mylib.o poly.o real.o zero.o
real.o: In function `rabs':
/cygdrive/c/../progs/real.c:9: undefined reference to `__imp___gmpf_abs'
/cygdrive/c/../progs/real.c:9:(.text+0x1e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp___gmpf_abs'
real.o: In function `radd':
我认为R_X86_64_PC32
指的是我正在使用的环境。我在Netbeans
的64位版本的gcc 5.4.0
中使用64位版本的cygwin
和Windows 10
。
任何人都可以建议解决这个问题,以便我可以构建C程序吗?
答案 0 :(得分:3)
问题在于:
gcc -lgmp -lm -lrt -o cbuild cbuild.o complex.o mylib.o poly.o real.o zero.o
默认情况下,链接器将按照命令行中指定的顺序链接库和对象,并且在链接库时,只会在命令行上包含之前所需的符号。由于-lgmp
是第一个,因此(尚未)没有未完成的符号(main
除外),因此库中不包含任何内容。当后来的对象需要来自它的符号时,他们将看不到它们。
将订单更改为
gcc -o cbuild cbuild.o complex.o mylib.o poly.o real.o zero.o -lgmp -lm -lrt
它应该有效。或者,使用-Wl,--as_needed
链接器选项让链接器记住早期的库并重新链接它们,如果后面的目标文件引用它们的更多符号(需要最新版本的GNU链接器 - 我不知道它是否是适用于cygwin)。
这种错误通常是Makefile损坏的症状。普通的Makefile结构有一堆变量,用于控制知道如何编译源文件和链接目标文件的默认规则。与链接相关的两个变量是LDFLAGS
和LDLIBS
,不同之处在于LDFLAGS
在命令行上的所有目标文件之前来自 {{1 之后所有目标文件。
因此,为了使工作正常,您需要确保所有LDLIBS
选项和其他库都在-l
中:
LDLIBS
LDLIBS = -lgmp -lrt -lm
中的和 NOT