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 -fvalgrind --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 退出状态,gcc

collect2:错误:ld 返回 1 退出状态 graphics.h

Cmake 无法在 qt creator/collect2 上编译简单的测试程序:错误:ld

collect2:错误:ld在c ++中返回1个退出状态[重复]