__thread lnking 错误在 OS X Lion 上使用 clang

问题描述

我正在尝试在运行 10.7.5 的旧 MacBook 上构建 Valgrind + regtest。我确实有一台装有 macOS 11 的较新 MacBook,但这太新了。

其中一项回归测试未能构建。这是来自 macports 的 clang 9 - OS X 10.7.5 [Apple LLVM 4.2 版] 的最新 XCode 太旧了。

在我的研究中,我遇到了一些建议使用“thread_local”的参考文献(例如 here)。但这将需要重新编写测试用例,并且存在不再执行相同测试的风险。

代码/构建说明相当长。如果有人积极性很高,他们可以从 https://sourceware.org/git/valgrind.git 克隆源。有问题的测试用例位于 none/tests 目录中。

我得到的错误

/opt/local/bin/clang-mp-9.0 -Winline -Wall -Wshadow -Wno-long-long -g -fno-stack-protector  -Wno-format-extra-args -Wno-literal-range -Wno-tautological-constant-out-of-range-compare -Wno-self-assign -Wno-string-plus-int -Wno-uninitialized -Wno-unused-value  -arch x86_64 -fPIC  -dynamic -dynamiclib -all_load -fpic -stdlib=libc++ -L/opt/local/lib/libcxx -o tls.so tls_so-tls_so.o `pwd`/tls2.so 
Undefined symbols for architecture x86_64:
  "_global",referenced from:
      _test_so_global in tls_so-tls_so.o
     (maybe you meant: _test_so_global)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command Failed with exit code 1 (use -v to see invocation)

要产生tls_so.o,来源是

#include <pthread.h>

extern __thread int so_extern;
static __thread int so_local;
extern __thread int global;

int *test_so_extern(void)
{
        return &so_extern;
}

int *test_so_local(void)
{
        return &so_local;
}

int *test_so_global(void)
{
        return &global;
} 
#endif

它是用

构建的
/opt/local/bin/clang-mp-9.0 -DHAVE_CONfig_H -I. -I../..  -I../.. -I../../include -I../../coregrind -I../../include -I../../VEX/pub -I../../VEX/pub -DVGA_amd64=1 -Dvgo_darwin=1 -DVGP_amd64_darwin=1 -DVGPV_amd64_darwin_vanilla=1 -DVGA_SEC_x86=1 -DVGP_SEC_amd64_darwin=1   -Winline -Wall -Wshadow -Wno-long-long -g -fno-stack-protector  -Wno-format-extra-args -Wno-literal-range -Wno-tautological-constant-out-of-range-compare -Wno-self-assign -Wno-string-plus-int -Wno-uninitialized -Wno-unused-value  -arch x86_64 -fPIC  -MT tls_so-tls_so.o -MD -MP -MF .deps/tls_so-tls_so.Tpo -c -o tls_so-tls_so.o `test -f 'tls_so.c' || echo './'`tls_so.c
mv -f .deps/tls_so-tls_so.Tpo .deps/tls_so-tls_so.Po

一个 .so链接到 tls2.so

本文来源包含

#include <pthread.h>
__thread int static_extern;

并建造它

paulf> make tls2.so
depbase=`echo tls2_so.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
        /opt/local/bin/clang-mp-9.0 -DHAVE_CONfig_H -I. -I../..  -I../.. -I../../include -I../../coregrind -I../../include -I../../VEX/pub -I../../VEX/pub -DVGA_amd64=1 -Dvgo_darwin=1 -DVGP_amd64_darwin=1 -DVGPV_amd64_darwin_vanilla=1 -DVGA_SEC_x86=1 -DVGP_SEC_amd64_darwin=1   -Winline -Wall -Wshadow -Wno-long-long -g -fno-stack-protector  -Wno-format-extra-args -Wno-literal-range -Wno-tautological-constant-out-of-range-compare -Wno-self-assign -Wno-string-plus-int -Wno-uninitialized -Wno-unused-value  -arch x86_64  -MT tls2_so.o -MD -MP -MF $depbase.Tpo -c -o tls2_so.o tls2_so.c &&\
        mv -f $depbase.Tpo $depbase.Po
/opt/local/bin/clang-mp-9.0 -Winline -Wall -Wshadow -Wno-long-long -g -fno-stack-protector  -Wno-format-extra-args -Wno-literal-range -Wno-tautological-constant-out-of-range-compare -Wno-self-assign -Wno-string-plus-int -Wno-uninitialized -Wno-unused-value  -arch x86_64  -dynamic -dynamiclib -all_load -stdlib=libc++ -L/opt/local/lib/libcxx -o tls2.so tls2_so.o 

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)