解决海思平台下C++启动线程报pure virtual method called, terminate called without an active exception问题

背景

最近在移植已有C++11的项目到海思平台中,工程师反馈遇到了下面的报错

而且卡了好几天都没解决。CSDN上也有人反馈说没有解决,到底该如何解决呢?

排查

首先看看环境。使用的工具链是arm-hisiv600-linux,其自身是gcc 4.9.4,板子是Hi3531D,CPU是A9核心。这里首先做了一个最简的例子编译并测试。

编译命令如下

编译出来一切正常,通过readelf确认下是否架构信息正确

看出结果是没问题的,Cortex-A9 + armv7 + Thumb2

结果放到板子上跑却遇到了另一个报错

至少好像信息有些变化,我们再针对这个gcc4.9和std::thread的operation not permitted再搜索下看,结果直接就查到了这个链接,文中提到了加入”-thread”编译选项可以解决问题。

接下来我尝试了下新的编译命令

编译完成后再次运行,就一切正常了。

分析

那为什么一开始gcc 4.9在编译带std::thread的时候不能正常启用pthread呢? 这可能是个bug,并且可以通过以下手段进行验证。对未加-pthread编译出来的文件使用readelf查看其链接到的动态链接库,

发现其实不包含libpthread.so.0,其实这就是原因。从编译到链接都不包含线程库支持。

唉~真是坑啊