运行时 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 重定位错误的主要内容,如果未能解决你的问题,请参考以下文章