运行时 gcc 重定位错误

Posted

技术标签:

【中文标题】运行时 gcc 重定位错误【英文标题】:gcc relocation error at runtime 【发布时间】:2011-08-31 01:11:46 【问题描述】:

目前我正在运行一些多线程代码,这些代码全部编译时没有错误或警告,当我执行代码时出现此错误:

重定位错误:/lib/x86_64-linux-gnu/libgcc_s.so.1: 1thread_mutex_locXãƨ+�������+ ������ƨ+�&쏭Ũ�Ȩ+e

什么是重定位错误?

【问题讨论】:

如何编译和链接代码? 没有代码这是无法诊断的。制作展示问题的最小可编译示例。 @Martin,我对错误消息本身更感兴趣,因为我以前从未见过它。我很确定我已经解决了这个问题。 重启并检查文件系统。比较 md5 和;重建您的应用程序。这看起来像是内存错误或磁盘数据损坏 【参考方案1】:

重定位是在代码中采用一些偏移到实际内存布局的过程。 重定位(将被重定位过程编辑的位置和每个重定位的描述)由编译器生成,例如对于 TLS 变量,对于动态库调用,对于 PIC/PIE 代码。重定位描述存储在二进制文件中(例如 Linux 中的 ELF 格式)。

重定位部分在链接步骤中完成,由 linux 中的ld 链接器程序完成;其他操作系统中的其他链接器。

但是有些重定位不能离线完成(在启动程序之前)。这种重定位需要使用 ASLR(地址空间布局随机化)来加载动态库。所以其中一些是在启动程序之前由程序解释器(Linux 中的ld.so)完成的,它也称为运行时链接器。它会将您的程序及其动态库加载到内存中并进行重定位。

完成重定位的第三个地方:调用 dlopen()(在 unix 中为 libdl.so)。它是动态加载动态库的库;并且因为动态库有重定位,所以这个库也应该这样做。

错误消息来自某个链接器,如果您在启动程序后看到此错误消息,这是第二种 (ld.so) 或第三种情况 (libdl)。

我找不到生成此消息的确切位置,但可能是由于

内存或磁盘数据损坏(非 ecc 内存或其他硬件错误),导致某些数据错误。重新启动;文件系统和 md5sums 检查;重新安装使用的软件包(glibc;libgcc);重新编译您的应用程序;重新插入内存,减少内存频率。 使用了一些未定义的符号。尝试将环境变量 LD_BIND_NOW(如果您使用的是 glibc 或衍生工具)设置为非 null。 程序本身损坏了它的内存。例如使用 Stack Overflow 或 Random Pointer Walk 或类似的东西。尝试使用valgrind(如果您使用的是英特尔)。 同步错误,允许您的程序破坏自己的内存。使用valgrind --tool=helgrind(如果你在英特尔并且有很多时间等待)

【讨论】:

以上是关于运行时 gcc 重定位错误的主要内容,如果未能解决你的问题,请参考以下文章

QT“重定位错误”/“没有可用的版本信息”运行时错误

编译系统和运行时的系统

重定位

重定位 R_X86_64_32S 对 `.data' 在制作共享对象时不能使用;使用 gcc 重新编译 -fPIC

dll 运行时错误(C/C++/GCC/MSVC)

使用 GCC 组装会导致 .data 出现奇怪的重定位错误