collect2:错误:ld 以信号 11 [分段错误] 终止,核心转储
Posted
技术标签:
【中文标题】collect2:错误:ld 以信号 11 [分段错误] 终止,核心转储【英文标题】:collect2: error: ld terminated with signal 11 [Segmentation fault], core dumped 【发布时间】:2014-08-18 20:16:57 【问题描述】:我正在使用 GLFW 学习 OpenGL,当时对 makefile 并没有很好的理解。我有 OpenGL 工作,但我决定更多地学习 makefile。经过很多网站、几个小时、反复试验,我想出了这个:
EXENAME = "OpenGL Demo"
CC = gcc
SRCS = ../src/OpenGLDemo.c
OBJS = $(SRCS: .c = .o)
CFLAGS = -Wall -g -c
LIBS = -L./libs -lglfw3 C:/Windows/SysWOW64/opengl32.dll C:/Windows/SysWOW64/glu32.dll
all: opengldemo exe
exe: $(OBJS)
$(CC) $(OBJS) -o $(EXENAME) $(LIBS)
opengldemo: ../src/OpenGLDemo.c
$(CC) $(CFLAGS) ../src/OpenGLDemo.c
clean:
rm -f $(EXENAME)
rebuild: clean all
但是,当我编译时,它会在尝试构建可执行文件时出现此错误:
collect2: error: ld terminated with signal 11 [Segmentation fault], core dumped
makefile:11: recipe for target 'exe' failed
make: *** [exe] Error 1
它确实构建了一个可执行文件,但我的计算机说它无法运行它。 我尝试搜索互联网,发现包括此错误的 gcc 错误报告。我可能正在做一些愚蠢的事情来得到这个错误。 我该如何解决这个错误,这是什么意思?
编辑:完整输出:
make
gcc -Wall -g -c ../src/OpenGLDemo.c
gcc ../src/OpenGLDemo.c -o "OpenGL Demo" -L./libs -lglfw3
C:/Windows/SysWOW64/opengl32.dll C:/Windows/SysWOW64/glu32.dll
cygwin warning:
MS-DOS style path detected: C:/Windows/SysWOW64/opengl32.dll
Preferred POSIX equivalent is: /cygdrive/c/Windows/SysWOW64/opengl32.dll
CYGWIN environment variable option "nodosfilewarning" turns off this warning.
Consult the user's guide for more details about POSIX paths:
http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
collect2: error: ld terminated with signal 11 [Segmentation fault], core dumped
makefile:11: recipe for target 'exe' failed
make: *** [exe] Error 1
【问题讨论】:
你能展示更多你的输出吗? @CarlNorum 这几乎就是输出。我会添加其余的,因为你问了。make
至少应该输出它正在运行的命令。
您是否尝试修复它警告您的路径名?
如果工具链的任何部分(编译器、链接器、make 等)崩溃,这不是程序员的错。无论你做了什么愚蠢的事情,工具都不应该崩溃。
【参考方案1】:
我遇到了完全相同的错误。
我同时在 Windows 和 Linux 上进行开发,并使用 Filezilla 传输我的文件。之前使用 Cygwin 在 Windows 上构建的代码,但在从我的 Linux 主机下载文件后不会。
该过程是在 Windows 上构建的 ==> 上传到 Linux 并构建 ==> 进行一些更改 ==> 下载到 Windows 并构建 ==> 出错。
然后我突然意识到我已经通过源代码传输了 Linux 目标文件,所以我删除了所有 .o 文件并且构建顺利。
我不能说这是否是@Zaerospi 的问题,但它似乎是我的错误的根源。
遇到相同错误的其他人可能想尝试擦除他们的目标文件并重新构建。
【讨论】:
非常感谢。 FWIW 对 32 位 cygwin 的 .o 文件运行“文件”命令应该说 `80386 COFF executable not stripped`,而对于 64 位 cygwin 应该说data
。如果他们说别的,他们可能是linux衍生的不小心。一个 linux 32 位 ex: `ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped` 和 64-bit 类似。【参考方案2】:
这意味着ld
工具或其依赖项之一存在导致无效内存访问(分段错误)的错误,操作系统在该错误上使用 SIGSEGV(信号 11)终止进程。无论您的构建设置如何,它都不会崩溃。
您可能应该向您的 Linux 发行版供应商或直接向ld
工具的供应商(通常是 GNU,以防您的 ld
工具来自 GNU binutils)提交一份关于 ld
的错误报告。
【讨论】:
没有直接的解决方案。要么开始调试它,要么给自己一个新的ld
。但是由于您似乎使用的是 cygwin,这两种解决方案都可能存在问题。在 Linux 上,我会使用 strace -f
或 valgrind --track-origins=yes --trace-children=yes
等开始调试,但在 cygwin 上这可能不是一个选项。不过,你可能比我更熟悉 cygwin。
刚刚收到类似的错误,可以确认是cygwin的问题。我把整个项目复制到了一台真正的 Linux 机器上,一切都编译好了。以上是关于collect2:错误:ld 以信号 11 [分段错误] 终止,核心转储的主要内容,如果未能解决你的问题,请参考以下文章
collect2:fatal error: ld terminated with signal 11 [Segmentation fault] 问题的解决
collect2: fatal error: ld terminated with signal 11 [Segmentation fault], core dumped
collect2:错误:ld 返回 1 退出状态 graphics.h