一、背景
一直以来对ndk的编译链接所依赖的文件没有完成弄明白,还有ida的导入、导出函数与dynsym section之间的关系是什么?
二、ndk编译所依赖的文件
1、我们一般在Application.mk中指定所需要的平台版本和编译后so的架构。
APP_PLATFORM := android-21
APP_ABI := armeabi-v7a
这个android-21对应什么呢?这是android ndk的根目录。
这里指定的编译so时,链接时需要的so文件,如果指定了android-21,那么链接时就到这个目录下寻找so。
2、下面看下Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := lesson2
LOCAL_SRC_FILES := Lesson2.cpp MyTest.cpp module.c
LOCAL_LDLIBS := -llog -ldl -lmediandk -lGLESv2
LOCAL_CPPFLAGS += -O3
LOCAL_CFLAGS += -fvisibility=hidden
include $(BUILD_SHARED_LIBRARY)
-lmediandk在链接时会使用android-ndk-r21/platforms/android-21/arch-arm/usr/lib/libmediandk.so
-lGLESv2在链接时会使用android-ndk-r21/platforms/android-21/arch-arm/usr/lib/libGLESv2.so
3、Lesson2.cpp
#include <media/NdkMediaDrm.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
在使用函数的地方还需要包含头文件,这些头文件在哪呢?
android-ndk-r21/sysroot/usr/include
4、使用的交叉编译工具
android-ndk-r21/toolchains/llvm/prebuilt/darwin-x86_64/bin
三、ida中Exports、Imports与dynsym之间的关系
arm-linux-androideabi-readelf -s liblesson2.so
Symbol table '.dynsym' contains 61 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FUNC GLOBAL DEFAULT UND __cxa_atexit@LIBC (2)
2: 00000000 0 FUNC GLOBAL DEFAULT UND __cxa_finalize@LIBC (2)
3: 00000000 0 FUNC GLOB