问题描述
我正在尝试在运行 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
本文来源包含
#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 (将#修改为@)