目前我正在运行一些多线程代码,所有代码都编译没有错误或警告,并且在执行代码时出现此错误:
重定位错误:/lib/x86_64-linux-gnu/libgcc_s.so.1:1thread_mutex_locXã+ + Ȩ+ ƨ+ &쏭Ũ Ȩ+ e
什么是重定位错误?
重定位是在代码中采用一些偏移到实际内存布局的过程.重定位(将通过重定位过程编辑的位置和每个重定位的描述)由编译器生成,例如用于TLS变量,用于动态库调用,用于PIC/PIE代码.重定位描述存储在二进制文件中(例如,在Linux中的ELF格式).
通过ldlinux中的链接程序,在链接步骤中部分完成重定位; 其他操作系统中的其他连接器.
但是有一些重新定位无法在离线状态下完成(在启动程序之前).使用ASLR(地址空间布局随机化)来加载动态库需要这样的重定位.因此,其中一些是在程序解释器(ld.so在linux中)启动程序之前完成的,也称为运行时链接程序.它会将您的程序及其动态库加载到内存中并进行重定位.
重定位完成的第三个地方:是对dlopen()(libdl.so在unix中)的调用.它是动态加载动态库的库; 并且因为动态库具有重定位,所以此库也应该执行重定位.
错误消息来自某个链接器,如果您在启动程序后看到此消息,则这是第二个(ld.so)或第三个案例(libdl).
我无法找到生成此消息的确切位置,但可能会到期
LD_BIND_NOW(如果您使用glibc或衍生物)设置为非null.valgrind(如果你在英特尔).valgrind --tool=helgrind(如果你是英特尔并且有很多时间等待)