没有运气编译__thread使用NDK铛3.4 / 3.5 [英] No luck compiling __thread using ndk clang 3.4/3.5

查看:531
本文介绍了没有运气编译__thread使用NDK铛3.4 / 3.5的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在这个小程序使用__thread没有运气。如果TLS在10℃NDK 3.4铿锵/ 3.5支持的任何想法?同样的程序编译罚款与海湾合作委员会NDK 4.8 / 4.9和原生铛/ GCC编译器。


下面是程序和编译行 -

  __线程INT计数器;
INT主(){计数器= 20;返回0; }[armeabi] ++编译大拇指:测试< = TEST.CPP
/Users/padlar/android/android-ndk-r10c/tool​​chains/llvm-3.5/$p$pbuilt/darwin-x86/bin/clang++ -MMD -MP -MF ./obj/local/armeabi/objs/test/test .od -gcc工具链/Users/padlar/android/android-ndk-r10c/tool​​chains/arm-linux-androideabi-4.8/$p$pbuilt/darwin-x86 -fpic -ffunction截面-funwind桌-fstack-保护-Wno-无效的命令行参数的-Wno-未使用的命令行参数的-no-canonical- prefixes -fno集成,如-target的ARMv5TE-NONE-Linux的androideabi -march =的ARMv5TE - mtune中的XScale = -msoft浮-fno-例外-fno-RTTI -mthumb -Os -g -DNDEBUG -fomit-frame-pointer的-fno严格走样-I /用户/ padlar /安卓/ Android的NDK-R10C /来源/ CXX-STL / STLport的/ STLport的-I /用户/ padlar /安卓/ Android的NDK-R10C /来源/ CXX-STL //加比++ /包括-Ijni -DANDROID -Wa, - noexecstack -Wformat -Werror =格式 - 安全-fPIE -frtti -I /用户/ padlar /安卓/ Android的NDK-R10C /平台/ Android的19 /弓臂/ usr / include目录-c JNI / TEST.CPP -o ./obj/local/armeabi /objs/test/test.o
[armeabi]可执行文件:测试
/Users/padlar/android/android-ndk-r10c/tool​​chains/llvm-3.5/$p$pbuilt/darwin-x86/bin/clang++轮候册, - GC-部分-Wl,-z,nocopyreloc --sysroot = /用户/ padlar /安卓/ Android的NDK-R10C /平台/ Android的19 /弓臂-Wl,-rpath链接= /用户/ padlar /安卓/ Android的NDK-R10C /平台/ Android的19 /弓-arm / usr / lib目录-Wl,-rpath链接= / OBJ /本地/ 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工具链/Users/padlar/android/android-ndk-r10c/tool​​chains/arm-linux-androideabi-4.8/$p$pbuilt/darwin-x86 -no-canonical- prefixes -target armv5te-没有-Linux的androideabi轮候册, - 无未定义-Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,现在-pie -fPIE -L /用户/ padlar /安卓/ Android的NDK -r10c /平台/ Android的19 /弓臂/ usr / lib目录-llog -lc -lm -o ./obj/local/armeabi/test
JNI / TEST.CPP:2:错误:未定义引用'__aeabi_read_tp
铛++:错误:连接命令,退出code 1(使用-v看看调用)失败
使:*** [OBJ /本地/ armeabi /测试]错误1


NDK - 这objdump的 -S OBJ /本地/ armeabi / OBJ文件/测试/ test.o

  OBJ /本地/ armeabi / OBJ文件/测试/ test.o:文件格式ELF32-littlearm
部分.text.main拆卸:00000000 lt;主计算值:
__thread INT计数器;
INT主(){计数器= 20;返回0; }
   0:b580推{R7,LR}
   2:4904 LDR R1,[PC,#16]; (14<主+ 0×14>)
   4:F7FF FFFE BL 0℃; __ aeabi_read_tp>
   8 1840增加了R0,R0,R1
   答:2114 MOVS R1,#20
   C:6001 STR R1,[R0,#0]
   E:2000 MOVS R0,#0
  10:BD80流行{R7,PC}
  12:46c0 NOP; (MOV R8,R8)
  14:00000000 .word 00000000


相同节目的gcc4.6 disass

NDK - 这objdump的 -S OBJ /本地/ armeabi / OBJ文件/测试/ test.o

  OBJ /本地/ armeabi / OBJ文件/测试/ test.o:文件格式ELF32-littlearm
部分.text.startup.main拆卸:00000000 lt;主计算值:
__thread INT计数器;
INT主(){计数器= 20;返回0; }
   0:B508推{R3,LR}
   2:4804 LDR R0,[PC,#16]; (14<主+ 0×14>)
   4:4478加R0,PC
   6:F7FF FFFE BL 0℃; __ emutls_get_address>
   答:2314 MOVS R3,#20
   C:6003 STR R3,[R0,#0]
   E:2000 MOVS R0,#0
  10:bd08流行{R3,PC}
  12:46c0 NOP; (MOV R8,R8)
  14:0000000c .word 0x0000000c


解决方案

__线程风格TLS(类似C ++ 11的风格 thread_local )目前不被Android链接(我们正在努力就行)的支持。现在,你将不得不使用 pthread_getspecific pthread_setspecific

I am trying to use __thread in this small program without luck. Any idea if this TLS is supported in ndk 10c clang 3.4/3.5? The same program compiles fine with ndk gcc 4.8/4.9 and native clang/gcc compilers.


Here is the program and compile line -

__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


ndk-which 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


gcc4.6 disass of the same program

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

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

解决方案

__thread style TLS (similarly C++11 style thread_local) is not currently supported by the Android linker (we're working on it though). For now you'll have to use pthread_getspecific and pthread_setspecific.

这篇关于没有运气编译__thread使用NDK铛3.4 / 3.5的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆