运行时的gcc重定位错误

时间:2011-08-31 01:11:47

标签: c++ gcc

目前我正在运行一些多线程代码,所有代码都编译没有错误或警告,并且在执行代码时出现此错误:

  

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

什么是重定位错误?

1 个答案:

答案 0 :(得分:7)

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

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

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

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

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

我无法找到生成此消息的确切位置,但可能是

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