为什么Android NDK附带了多个libgcc.a,应该使用它与之链接?

时间:2018-09-04 09:56:02

标签: android gcc android-ndk linker clang

Android NDK 17(我也假设是早期版本),包含libgcc.a的多个版本:

android-ndk-r17b/toolchains/arm-linux-androideabi-4.9$ find -iname 
libgcc.a
./prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a
./prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/libgcc.a
./prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/hard/libgcc.a
./prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb/libgcc.a
./prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb/hard/libgcc.a
./prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/thumb/libgcc.a

libatomic.a

相同
android-ndk-r17b/toolchains/arm-linux-androideabi-4.9$ find -iname libatomic.a
./prebuilt/linux-x86_64/arm-linux-androideabi/lib/libatomic.a
./prebuilt/linux-x86_64/arm-linux-androideabi/lib/armv7-a/libatomic.a
./prebuilt/linux-x86_64/arm-linux-androideabi/lib/armv7-a/hard/libatomic.a
./prebuilt/linux-x86_64/arm-linux-androideabi/lib/armv7-a/thumb/libatomic.a
./prebuilt/linux-x86_64/arm-linux-androideabi/lib/armv7-a/thumb/hard/libatomic.a
./prebuilt/linux-x86_64/arm-linux-androideabi/lib/thumb/libatomic.a

每个包含目录的确包含全套crtbegin.ocrtend.o等...

$ ls ./prebuilt/linux-x86_64/arm-linux-androideabi/lib/armv7-a/
crtbegin.o  crtbeginS.o  crtbeginT.o  crtend.o  crtendS.o  libgcc.a  libgcov.a

检查每一个,它们的大小是不同的(我认为是内容)。

  • 这些版本之间有什么区别?
  • 链接器应使用其中的哪些来创建有效的.so文件?

1 个答案:

答案 0 :(得分:2)

  • thumb是指指令集(大多数ARM处理器具有不同的运行时可切换操作模式,这些模式可为您提供不同的指令集)。非拇指大概意味着arm
  • hard是指ABI变量,它确定如何将浮点参数传递给函数(现已弃用AFAIK)。
  • 路径中没有armv7-a的库大概是针对现在不推荐使用的armeabi(即ARMv5TE)。