为什么Android NDK附带了多个libgcc.a,哪一个应该用来链接?

问题描述 投票:0回答:1

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文件?
android gcc android-ndk linker clang
1个回答
2
投票
  • thumb指的是指令集(大多数ARM处理器具有不同的运行时可切换操作模式,为您提供不同的指令集)。非拇指可能意味着arm
  • hard是指确定如何将浮点参数传递给函数的ABI变量(现在已弃用AFAIK)。
  • 在路径中没有armv7-a的库可能是现在已弃用的armeabi(即ARMv5TE)。
© www.soinside.com 2019 - 2024. All rights reserved.