运行时的gcc重定位错误

shu*_*e87 7 c++ gcc

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

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

什么是重定位错误?

osg*_*sgx 8

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

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

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

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

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

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

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