Android 使用ndk clang 3.4/3.5编译线程时运气不佳

Android 使用ndk clang 3.4/3.5编译线程时运气不佳,android,c++,android-ndk,clang++,thread-local-storage,Android,C++,Android Ndk,Clang++,Thread Local Storage,我正试图在这个小程序中使用线程,但没有运气。你知道ndk 10c clang 3.4/3.5是否支持该TLS吗?同样的程序可以使用ndk gcc 4.8/4.9和本机clang/gcc编译器进行良好编译 这是程序和编译行- __thread int counter; int main () { counter=20; return 0; } [armeabi] Compile++ thumb: test <= test.cpp /Users/padlar/android/android

我正试图在这个小程序中使用线程,但没有运气。你知道ndk 10c clang 3.4/3.5是否支持该TLS吗?同样的程序可以使用ndk gcc 4.8/4.9和本机clang/gcc编译器进行良好编译


这是程序和编译行-

__thread int counter;
int main () { counter=20; return 0; }

[armeabi] Compile++ thumb: test <= test.cpp
/Users/padlar/android/android-ndk-r10c/toolchains/llvm-3.5/prebuilt/darwin-x86/bin/clang++ -MMD -MP -MF ./obj/local/armeabi/objs/test/test.o.d -gcc-toolchain /Users/padlar/android/android-ndk-r10c/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86 -fpic -ffunction-sections -funwind-tables -fstack-protector -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -no-canonical-prefixes -fno-integrated-as  -target armv5te-none-linux-androideabi -march=armv5te -mtune=xscale -msoft-float -fno-exceptions -fno-rtti -mthumb -Os -g -DNDEBUG -fomit-frame-pointer -fno-strict-aliasing -I/Users/padlar/android/android-ndk-r10c/sources/cxx-stl/stlport/stlport -I/Users/padlar/android/android-ndk-r10c/sources/cxx-stl//gabi++/include -Ijni -DANDROID  -Wa,--noexecstack -Wformat -Werror=format-security -fPIE  -frtti     -I/Users/padlar/android/android-ndk-r10c/platforms/android-19/arch-arm/usr/include -c  jni/test.cpp -o ./obj/local/armeabi/objs/test/test.o
[armeabi] Executable     : test
/Users/padlar/android/android-ndk-r10c/toolchains/llvm-3.5/prebuilt/darwin-x86/bin/clang++ -Wl,--gc-sections -Wl,-z,nocopyreloc --sysroot=/Users/padlar/android/android-ndk-r10c/platforms/android-19/arch-arm -Wl,-rpath-link=/Users/padlar/android/android-ndk-r10c/platforms/android-19/arch-arm/usr/lib -Wl,-rpath-link=./obj/local/armeabi ./obj/local/armeabi/objs/test/test.o /Users/padlar/android/android-ndk-r10c/sources/cxx-stl/stlport/libs/armeabi/thumb/libstlport_static.a -lgcc  -gcc-toolchain /Users/padlar/android/android-ndk-r10c/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86 -no-canonical-prefixes -target armv5te-none-linux-androideabi  -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -fPIE -pie  -L/Users/padlar/android/android-ndk-r10c/platforms/android-19/arch-arm/usr/lib -llog -lc -lm -o ./obj/local/armeabi/test
jni/test.cpp:2: error: undefined reference to '__aeabi_read_tp'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [obj/local/armeabi/test] Error 1

gcc4.6同一程序的disass

ndk哪个objdump
-S obj/local/armeabi/objs/test/test.o

obj/local/armeabi/objs/test/test.o:     file format elf32-littlearm
Disassembly of section .text.main:

00000000 <main>:
__thread int counter;
int main () { counter=20; return 0; }
   0:   b580        push    {r7, lr}
   2:   4904        ldr r1, [pc, #16]   ; (14 <main+0x14>)
   4:   f7ff fffe   bl  0 <__aeabi_read_tp>
   8:   1840        adds    r0, r0, r1
   a:   2114        movs    r1, #20
   c:   6001        str r1, [r0, #0]
   e:   2000        movs    r0, #0
  10:   bd80        pop {r7, pc}
  12:   46c0        nop         ; (mov r8, r8)
  14:   00000000    .word   0x00000000
obj/local/armeabi/objs/test/test.o:     file format elf32-littlearm
Disassembly of section .text.startup.main:

00000000 <main>:
__thread int counter;
int main () { counter=20; return 0; }
   0:   b508        push    {r3, lr}
   2:   4804        ldr r0, [pc, #16]   ; (14 <main+0x14>)
   4:   4478        add r0, pc
   6:   f7ff fffe   bl  0 <__emutls_get_address>
   a:   2314        movs    r3, #20
   c:   6003        str r3, [r0, #0]
   e:   2000        movs    r0, #0
  10:   bd08        pop {r3, pc}
  12:   46c0        nop         ; (mov r8, r8)
  14:   0000000c    .word   0x0000000c
obj/local/armeabi/objs/test/test.o:文件格式elf32 littlearm
分解.text.startup.main节:
00000000 :
__线程计数器;
int main(){counter=20;返回0;}
0:b508推送{r3,lr}
2:4804 ldr r0,[pc,#16];(14 )
4:4478添加r0,pc
6:f7ff fffe bl 0
a:2314电影r3#20
c:6003STRR3[r0,#0]
e:2000电影r0,#0
10:bd08 pop{r3,pc}
12:46c0 nop;(mov r8,r8)
14:0000000 C.字0x0000000c

首先,你应该避免使用线程,因为它可能不可移植

以下是gnu gcc在这里所说的:

GCC用于实现这一点的运行时模型起源于IA-64处理器特定的ABI,但后来也被迁移到其他处理器。它需要来自链接器(ld)、动态链接器(ld.so)和系统库(libc.so和libpthread.so)的重要支持,因此它并非无处不在

来自维基百科:

C++0x引入了thread\u local关键字。除此之外,各种C++编译器实现提供了声明线程局部变量的具体方法:

因此,它可以与
thread\u local
keyword

\uu thread
样式TLS(类似于C++11样式
thread\u local
)一起工作。Android链接器目前不支持TLS(不过我们正在研究它)。现在,您必须使用
pthread\u getspecific
pthread\u setspecific

编辑:从NDK r12开始,Clang支持模拟TLS。虽然上述内容在技术上仍然正确(设备上的链接器不支持此功能),但编译器可以代表您使用pthread调用替换内置TLS支持


注意:在r14之前,Android仍然只支持带有普通析构函数的对象的
thread\u local
。请参阅和的讨论。

我的代码可以追溯到2004年,使用的是2016年仍然没有在Android上构建的_线程/thread_local。我没有屏住呼吸……它将出现在NDK的下一个版本中(或者可能是
N+1
)。Clang现在通过pthread线程特定数据支持TLS仿真(GCC已经有一段时间了),这将允许您使用
\uu thread
。谢谢Dan,您能更具体地介绍一下NDK版本吗?我希望在接下来的几个月内,但事情在最后一刻仍需要更改。是否会尽快发布一个候选版本(这可能意味着几周?)自从回答这个问题以来,情况有没有改变?
Sun Studio C/C++, IBM XL C/C++, GNU C and Intel C/C++ (Linux systems) use the syntax:

    __thread int number;
Visual C++, Intel C/C++ (Windows systems), Borland C++ Builder and Digital Mars C++ use the syntax:

    __declspec(thread) int number;
 Borland C++ Builder also supports the syntax:

    int __thread number;