【发布时间】:2018-07-25 19:25:43
【问题描述】:
我需要构建一个可移植的共享对象,它是 Linux 上另一个软件的插件。我对该主题进行了一些阅读,得出的结论是,我应该使用相当旧的 glibc(以提供与旧系统的兼容性)构建一个 sysrooted gcc(如果重要,gcc 5.4.0),链接到@987654321 @ 和 -static-libgcc 从而到达了一个点,我有一些东西只依赖于主机 glibc 和一些其他的小东西,它们将永远存在。
现在,我做了所有这些,现在我遇到了一个奇怪的崩溃 - 分段错误发生在代码调用 std::thread 的地方,而 gdb 实际上显示堆栈帧在 libstdc++.so.6 内(应该在哪里不是,我的共享对象的ldd 也没有列出libstdc++.so)。崩溃时的栈顶是:
#0 0x0000000000000000 in ?? ()
#1 0x00007ffff79075e3 in std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>, void (*)()) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 # THIS SHOULD NOT BE HERE RIGHT?
#2 0x00007ffff5a25a5c in std::thread::thread<void (ReferenceAnalytics::*)(std::timed_mutex&), ReferenceAnalytics*&, std::reference_wrapper<std::timed_mutex> >
(this=0x7fffffffcf40, __f=
@0x7fffffffcf60: (void (ReferenceAnalytics::*)(ReferenceAnalytics * const, std::timed_mutex &)) 0x7ffff5a1750c <ReferenceAnalytics::WorkerThreadMethod(std::timed_mutex&)>)
at /home/developer/Toolchains/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/5.4.0/thread:137 # Looks like my toolchain
所以,我做了一些阅读,然后使用 nm 发现我的共享对象具有所有 std::thread 东西,如 ctor、dtor、swap ......定义为弱符号(我假设这会导致冲突如果加载插件的主机使用动态libstdc++,然后我的呼叫被路由到那里并且所有地狱都崩溃了,是这样吗?)。
我对谷歌搜索和阅读的进一步尝试没有给我一个答案,我该如何控制这一点,因为在我的 sysrooted gcc 中强制将 std::thread 的东西解析为静态 libstdc++?
此外,我创建了一个小型可执行文件,它只在我的共享对象上执行dlopen,然后调用一个内部构造线程的方法 - 如果可执行文件也是使用-static-libstdc++ 构建的,那么一切都很好,如果不是,崩溃发生。所以我假设我关于std::thread 的弱符号被解析到主机libstdc++ 的理论是正确的,但是如何解决这个问题呢?
【问题讨论】:
标签: c++ linux shared-libraries libstdc++ gcc5