作者: Sam (甄峰) sam_code@hotmail.com
之前每次升级NDK,均会遇到或大或小的问题,常见的问题有:NDK下的C库,C++库与Android设备内的库不匹配等。但这次从android-ndk-r10e
升级到android-ndk-r14b.
却遇到不少有特色的问题。记录如下:
1. 在Amlogic AArch64--S905X平台:
Android版本:6.0.1
Kernel版本:3.14.29
这个平台虽然是64bit平台。但烧入的Image中,包含的库却是32bit.
使用NDK-r10e编译的C程序,C++程序,均可正常运行。
使用NDK-r14b编译的C程序。C++程序,32Bit下,clang/GCC编译的均正常运行。
使用NDK-r14b编译的C程序,C++程序, 64Bit下,均无法正常运行。(这也符合预期)
2. 在另一个Amlogic AArch64盒子--NEXBOX-A95X:
Android版本:6.0.1
这个平台虽然是64bit平台。但烧入的Image中,包含的库却是32bit.
使用NDK-r10e编译的C程序,C++程序,均可正常运行。
使用NDK-r14b编译的C程序。C++程序,32Bit下,clang/GCC编译的均正常运行。
使用NDK-r14b编译的C程序,C++程序, 64Bit下,均无法正常运行。(这也符合预期)
3. Amlogic S905 32bit--中兴媚盒2:
使用NDK-r10e编译的C程序,C++程序,均可正常运行。
使用NDK-r14b编译的C程序。C++程序,32Bit下,clang/GCC编译的均正常运行。
使用NDK-r14b编译的C程序,C++程序, 64Bit下,均无法正常运行。(这也符合预期)
4. RK3288 32Bit:
Android版本:5.1.1
Kernel版本:3.10.0
使用NDK-r10e编译的C程序,C++程序,均可正常运行。
使用NDK-r14b编译的C程序。C++程序,32Bit下,clang/GCC编译的均正常运行。但只要是r14b编译的ELF(不管可执行程序还是动态库),均会在运行时报错如下:
WARNING: linker:
./Test_NDK: unused DT Entry: type 0x6ffffffe arg
0xd3c
WARNING: linker:
./Test_NDK: unused DT Entry: type 0x6fffffff arg
0x1
WARNING: linker:
libV4L2_utils.so: unused DT Entry: type
......
WARNING: linker:
libV4L2_utils.so: unused
DT Entry: type.....
WARNING: linker:
libgnustl_shared.so: unused DT Entry: type
......
WARNING: linker:
libgnustl_shared.so: unused
DT Entry: type.....
看到DT Entry, 感觉是ELF内的东西。可为何R14编译的东西,会在RK3288上报这个警告呢?
DT Entry: 用来在ELF文件头中描述Array Entry.
可执行程序和库会需要一些Dynamic Array Tags(DT). 但并不是所有的Entry是必需的,也有些已经不可用。
有哪些以及哪些DT Entry可用, 依赖于具体处理器和指令集。
所以:这个Warning的出现,原因是有DT Entry编译入了可执行程序或动态库,但Kernel却表示不支持。
导致的原因:
1. ARM Kernel交叉编译时,用到错误的Flags。 通常指不正确的处理器指令集。
2. ARM可执行程序或动态库使用了已经弃用的编译选项。
从Android 5.1(API 22)开始, Android Linker对VERNEED和VERNEEDNUM ELF
dynamic section报警。
type 0x6ffffffe, type
0x6fffffff正是它俩。
察看那个API版本关心那些DT,可以看NDK/platfomrs/android-xx/arch-xxx/usr/include/linux/elf.h
察看某个可执行程序或动态库有哪些DT:
#readelf --dynamic Test_NDK
可以看到,其中包含:
0x6ffffffe (VERNEED) 0xce8
0x6fffffff (VERNEEDNUM) 1
就是他们导致警告。