从ndk编译,说到so文件结构以及ida导入、导出函数

本文详细探讨了NDK编译过程中依赖的文件,包括Application.mk、Android.mk、头文件路径及交叉编译工具。同时,通过分析ida中的Imports、Exports与dymsym的关系,揭示了.so文件的内部结构。文章还介绍了.so中的.rel.dyn、.rel.plt、.plt和.got表在动态链接过程中的作用。
摘要由CSDN通过智能技术生成

一、背景

一直以来对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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值