Quantcast
Channel: Sam的技术Blog
Viewing all articles
Browse latest Browse all 158

NDK升级遇到的一些问题汇总

$
0
0
作者: 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

就是他们导致警告。


 

Viewing all articles
Browse latest Browse all 158

Trending Articles