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