基于android2.3.5系统:Android动态库链接

纯血鸿蒙Native层支持说明 组合实现C11标准C库。libc:包含线程相关接口,以及大部分标准接口。libm:数学库函数接口,当前在HarmonyOS中是一个链接,实际都在libc中定义。libdl:dlopen等动态链接器接口,当前在HarmonyOS中是一个链接,实际都在libc中定义。 阅读详情

***************************************************************************************************************************
作者:EasyWave                                                                                 时间:2013.03.24

类别:Android系统源码分析                                                              声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

***************************************************************************************************************************

跟普通的linux基本一样,不过android是采用了自己的glibc,也就是在bionic这个文件中,在这个文件夹中它有libc、libdl、libm、libstdc++、libthread_db以及linker,如下图所示:

1):libc

libc是Android下的C的函数库。
bionic libc是基本的C语言函数库,包含了C语言最基本的库函数。这个库可以根据 头文件划分为 几个 个部分,包括:字符类型、错误码、 浮点常数、数学常数、标准定义 、 标准 I/O、工具函数、字符串操作 等等。如下图所示:

2):libdl
这个一个跟动态库链接有关的一个库,也就是说,所有libxxx.so都是由它来打开。它提供了如下的函数供应用开发者动态的打开和加载动态库,如下:

void *dlopen(const char *filename, int flag) { return 0; }
const char *dlerror(void) { return 0; }
void *dlsym(void *handle, const char *symbol) { return 0; }
int dladdr(void *addr, Dl_info *info) { return 0; }
int dlclose(void *handle) { return 0; }


不过需要注意的是,上面函数的具体实现,却是在bionic/linker/Dlfcn.c中实现的。如下所示:

3):libm

这个是andriod下的标准数学库

4):libstdc++

这个是G++相关的库

5):libthread_db

这是跟线程相关的库函数。

6):linker

linker 主要用于实现共享库的加载与链接。它支持应用程序对库函数的隐式和显式调用。对于隐式调用,应用程序的编译与静态库大致相同,只是在静态链接的时候通过--dynamic-linker /system/bin/linker 指定动态链接器,(该信息将被存放在ELF文件的.interp节中,内核执行目标映像文件前将通过该信息加载并运行相应的解释器程序linker.)并链接相应的共享库。与ld.so不同的是,Linker目前没有提供Lazy Binding机制,所有外部过程引用都在映像执行之前解析。对于显式调用,可以同过linker中提供的接口dlopen,dlsym,dlerror和dlclose来动态加载和链接共享库。

在说到linker时,不得不提PreLinker机制,Prelink即预链接技术是利用事先链接以代替运行时链接的技术,以加快共享库的加载速度,它不仅能加快程序启动时间,还可以减少部分内存开销(它能使KDE的启动时间减少50%)。每次程序执行时,进行的链接动作都是一样的,链接相对来说开销很大,尤其是嵌入式系统。

Android的Prelink的机制:
Android源码中有一组map文件,其中定义了需要预连接的动态库,其Prelink信息以及对应的逻辑地址(4G地址空间中位置),在动态库编译时,预处理程序apriori根据map文件中的定义,生成预链接信息重定向信息,并加入这些二进制文件lib*.so的末尾。它主要节约了查询函数地址等工作所用的时间,动态库重定位的开销。在运行程序,动态库加载时,加载程序linker判断动态库是否为Prelink的,如果是的话,就在首次使用时将其加载到指定的内存空间,直接使用预编译信息。如果要打开prelinker的话,需要进行一些配置,在Android.mk中设置该库是否需要Prelink,默认是使用Prelink的,也可设置成否,方法如下:
LOCAL_PRELINK_MODULE := false
在android中它是以build/core/prelink_linux_arm.map文件为基础,来分配动态库的地址的,如下所示:

也就是说,如果想自己添加第三方动态库的话,就需要在build/core/prelink-linux-arm.map 中加入形如libxxx.so 0xxx000000。
手工指定某个库相应的prelink地址范围,库应用对齐1M边界,注意库与库之间的间隔数,如果指定不好编译的时候会提示说地址空间冲突的问题。另外,注意排序,这里要把数大的放到前面去,按照大小降序排序。
而在andriod中,以apriori中的prelinkmap.c它用根据整个系统设置BoardConfig.mk的内存分配规则(3G/1G, 2G/2G)来判断map中指定地址是否符合Prelink的地址空间范围,如果正常,则在so的末尾加入prelink信息和标识(文件以PRE结束),apriori可以预先为若干共享库确定加载地址,并为有依赖关系的共享库做静态重定位和连接, 该命令加入参数--verbose,即可显示出prelink的细节。

以下为网络摘取:
       linker是Android的专用动态链接库键接器,Linker和传统Linux使用的linker(ld.so,ld-linux.so.2,ld-linux.so.3)有所不同。库的编译参数-dynamic-linker指定了键接器为/system/bin/linker(也可以手动换成别的),该信息将被存放在ELF文件的.interp节中,内核执行目标映像文件前将通过该信息加载并运行相应的解释器程序linker,并链接相应的共享库,共享库以ELF文件的形式保存在文件系统中。核心的load_elf_binary会首先将其映像文件映射到内存,然后映射并执行其解释器也就是linker的代码。linker的代码段是进程间共享的,但数据段为各进程私有。
所有外部过程引用都在映像执行之前解析, Android中的共享库和可执行映像都默认采用ELF格式的文件. 程序头表包含了加载到内存中的各种段的索引及属性信息,它将告诉加载器如何加载映像,初始化时,动态链接器首先解析出外部过程引用的绝对地址,一次性的修改所有相应的GOT表项。
linker会在共享库加载时,调用is_prelinked查看该库是否是prelink的,并在alloc_mem_region中检查目的地址是否被占用。如果该库不是prelink的,则库加载的起始地址为零。

Qt Andriod 在Windows系统下编译和添加动态库(一) Qt Andriod 在Windows系统下编译和添加动态库 文章目录Qt Andriod 在Windows系统下编译和添加动态库前言一、Qt 在Windows 系统下如何编译Andriod使用的动态库?二、Qt for Andriod如何在Windows开发环境下调用动态库1.修改.pro文件2.构建时添加库文件和将库文件一起打包3.在新的项目中调用该库总结 日期 作者 版本 说明 2020.12.15 Sleep Tiger V1.0 Release as V1.0 前言 因为项 阅读详情

相关推荐

Android平台FFmpeg4.3动态库编译与优化实战

动态链接库(Dynamic Link Library)作为代码复用的重要技术,通过运行时加载机制显著提升程序模块化程度。在音视频处理领域,FFmpeg凭借其跨平台特性和丰富的编解码器支持成为行业标准方案。针对Android平台的NDK开发环境,合理配置工具链和编译参数可充分发挥ARM NEON指令集的硬件加速能力。通过CMake实现交叉编译时,需特别注意ABI兼容性和符号表管理等工程实践细节。本文以FFmpeg4.3为例,详细解析从源码编译、性能优化到多架构打包的全流程方案,其中涉及的关键技术如汇编优化、动

weixin_30650039的博客 336

Android中Bionic模块

在可执行文件的装载过程中,所有装载进来的动态库对应的soinfo结构都会放到一个链表中,当新装载一个动态库时,会首先检查它是否已经存在于链表中,如果不存在才会继续装载。而linker伪造了一个libdl.so的soinfo结构,并放在了链表第一个元素的位置,因此程序中链接的libdl.so并不会真正的装载。Hook API的原理是利用ptrace函数把一小段代码注入目标程序中,这小段代码的任务是:装载自己开发的动态库到目标进程中,然后查找目标进程中特定函数在全局偏移表中的位置,替换成自己动态库的函数地址。

qq_46422460的博客 1821

ARMv7l架构Android系统动态库文件深入解析

ARMv7架构是ARM公司设计的一系列32位RISC处理器架构的代号。这一架构自从2000年代初期开始,逐渐成为移动设备处理器架构的事实标准。ARMv7架构在保持低功耗的基础上,加强了计算性能和多媒体处理能力,这使得搭载ARMv7处理器的移动设备在处理速度上有了质的飞跃。ARMv7架构的主要特点包括:高性能与能效比:通过对处理器的优化设计,ARMv7在提供高性能的同时,保证了低功耗的运行。丰富的指令集:ARMv7拥有丰富的指令集,支持多种编程语言和操作系统。

weixin_35757531的博客 1311

Bionic 简介

一、为什么要学习Bionic Bionic库是Android的基础库之一,也是连接Android系统和Linux系统内核的桥梁,Bionic中包含了很多基本的功能模块,这些功能模块基本上都是源于Linux,但是就像青出于蓝而胜于蓝,它和Linux还是有一些不一样的的地方。同时,为了更好的服务Android,Bionic中也增加了一些新的模块,由于本次的主题是Androdi的跨进程通信,所以了解Bionic对我们更好的学习Android的跨进行通信还是很有帮助的。 Android除了使用ARM版本的内

m0_38012497的博客 2692

【CQUT】从零开始龙芯杯-开始前的准备

不同级别的Cpu对于vivado综合的时间有较大影响,其中Cpu的单核、多核性能以及cache性能影响权重较高。因此,为了保证学习进度和效率,我们建议在Cpu不低于I5 12400的环境下进行学习。Vivado2023.2安装包约100GB,为了保证成功安装建议留出300GB硬盘空间。龙芯杯的许多资料被托管在gitee,你需要git指令将资料克隆到本地。指定用书:CPU设计实战 Loongarch版 作者:汪文祥、邢金璋。Cpu性能对比网站:https://www.cpu114.com/

weixin_73689971的博客 906

深度学习---双层神经网络中矩阵的运算及其含义记录

深度学习---双层神经网络中矩阵的运算及其含义记录神经网络的正向传播与反向传播正向传播第一层的权重矩阵第一层的输入矩阵Z^1^ = W^1^X^1^ + b^1^A^1^ = σ(Z^1^)第二层的权重矩阵第二层的输入矩阵Z^2^ = W^2^A^1^ + b^2^反向传播dz^2^ = A^2^ - Ydw^2^ = 1/n dz^2^A^1T^db^2^ = 1/n np.sum(dz^2...

qq_43228441的博客 3742

Android 引入OpenCL详细步骤

鉴于为了演示搭建环境时遇到的坑和解决方法,本文写的非常长。 提升native代码执行效率的方法主要有算法优化,比如for循环展开;neon汇编优化,可以显著提升cpu的效率;另外就是将native代码运行在GPU侧,因为cpu上面跑的任务太多,主线程经常被其他APP抢占,而使用GPU的APP不是很多,所以可以将任务跑在GPU上,OpenCL对GPU硬件有要求,有的GPU支持OpenCL,有的则不支持。华为,荣耀很多手机都支持OpenCL。 另外,本人今天发现opencv的SDK中也有OpenCL的头文件。

hugang的博客 6733

同花顺API实战指南:从零搭建股票数据自动化采集系统

本文提供了一份详尽的同花顺API实战指南,手把手教你从零开始搭建股票数据自动化采集系统。内容涵盖API权限申请、Python环境配置、数据采集与存储脚本编写、自动化定时任务实现以及数据清洗等核心环节,旨在帮助量化交易与数据分析爱好者构建稳定可靠的数据源,解放双手,提升研究效率。

weixin_29200741的博客 2395

深入 Android 源码系列(一)

首先,每天看到不断有新人关注着这个公众号,心情很是愉悦。一种认可,一种信任,也是我前进的动力。感谢大家的支持与鼓励。   本文讲解内容有     loadLibrary流程      linker      ELF     ndk开发以及配置调试版本     ndk-gdb –start调试so     gdb 调试bin文件  gdb调试android apk方案关于本文讲

程序员入门进阶 4431

医药行业SAP序列号管理深度解析:如何满足GMP合规要求

本文深度解析了医药行业如何利用SAP序列号管理构建满足GMP合规要求的数字化追溯体系。文章详细阐述了SAP序列号在实现从生产到患者全流程“一物一码”精准追溯中的核心作用,并探讨了其与质量管理、冷链监控等系统的关键集成配置,为医药企业应对严格监管、保障产品质量与安全提供了切实可行的技术方案。

backprop5master的博客 655

VL53L1X vs VL53L0X:激光测距传感器选型指南与性能对比

本文深入对比了VL53L1X与VL53L0X两款激光测距传感器的核心差异。VL53L1X采用区域ToF原理,在抗环境光干扰、最大测距及多目标识别方面优势显著,尤其适合复杂光线与动态场景。文章结合机器人避障、无人机定高等实战场景,提供了清晰的选型决策树,帮助工程师根据测距需求、环境复杂度与系统成本做出最优选择。

weixin_29197699的博客 393

【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )

I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . Module 级别的 build.gradle 完整配置代码 VI . CMakeList.txt 完整配置代码 VII . 博客资源

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 4278

Jetson Orin NX深度学习环境配置全攻略:从JetPack到PyTorch避坑指南

本文提供Jetson Orin NX深度学习环境配置的完整避坑指南。重点讲解如何正确利用JetPack SDK作为系统基石,使用Miniforge管理Python环境,并安装与CUDA版本严格匹配的PyTorch特供版本。通过详细的步骤和验证方法,帮助开发者在ARM架构的嵌入式平台上高效搭建稳定的AI开发工作站。

yolo5detector的博客 270

【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )

I . Android Studio 中使用 Android.mk 配置动态库库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三方 动态库 ( Android.mk ) V . 链接动态库 ( 设置动态库依赖 ) VI . Java 代码定义 native 方法并加载动态库 VII . C 代码调用动态库函数 VIII . 动态库加载版本限制 ( 6.0 以上 不能使用 Android.mk 配置动态库 ) IX . 完整代码示例 1 . bu

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3764

搭建你的第一个MCP服务器(Python版)

在上两篇博客中,我们已经对MCP(Model Context Protocol)有了初步的了解。MCP是一种强大的协议,能够简化LLM(大型语言模型)与外部工具的交互。今天,我们将通过一个具体的例子,展示如何使用Python搭建一个简单的MCP服务器。通过这个过程,你将能够更好地理解MCP的工作原理,并为后续的应用开发打下基础。在MCP中,工具(Tool)是服务器提供给LLM的接口。我们将定义一个简单的工具,用于接收输入文本并返回处理后的结果。首先,我们需要定义一个工具类。这个工具类将继承自,并实现run。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 8093

第186篇 前馈控制——提升跟踪精度的补充手段

文章摘要: 本文介绍了前馈控制的原理及其在工程中的应用。与反馈控制不同,前馈控制通过提前预测目标值或扰动信息来生成控制量,避免误差出现后再纠正的延迟问题,适用于机器人、机械臂等高速运动场景。前馈控制通常与PID反馈配合使用,前者提供粗调,后者进行微调。文章详细讲解了前馈增益的调节方法(模型法、实验法、自适应法)及两种前馈类型(指令前馈和扰动前馈),并提供了代码示例和面试实战建议,强调前馈与反馈的协同设计是提升控制精度的关键。最后预告了下一篇将讨论串级PID控制架构。

郑伟强dev的专栏 397

动态库(.so)链接静态库(.a)的情况总结

动态库(.so)链接静态库(.a)的情况总结 一般来说在链接时想要使用静态库有三种方法: 1、link时加上 -static 选项;当加上 -static选项后,gcc会把所有用到的库都做静态连接。 2、link时直接指定想要静态连接的.a文件的绝对路径。优点是除非.a文件不存在,否则肯定有效;缺点也是很明显,拿到其他机器上编译时,.a文件也必须在相同的路径下存放。 3、在要静态连接的库前指定-Bstatic ,在要动态连接的库前指定-Bdynamic选项。连接器在看到-Bstatic时会优于去找.

好习惯成就伟大 4561

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

安卓JNI下的静态库和动态库编译及使用

安卓使用原生代码一般都是以编译成动态库的形式直接在Java中应用 当需要构建大型项目的时候,一般希望向上层提供一个动态库,而内部能够引用多个静态库 分模块的形式达到解耦合的目的 以实例说明,编译生成静态库后,在动态库中引用静态库,并最终生成一个动态库提供到上层 生成静态库 Android.mk LOCAL_PATH := $(call my-dir) inclu...

Ataraxia的专栏 2298

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

突破Android构建瓶颈:Xmake中动态库链接OpenMP静态库的完整解决方案

你是否在Android NDK开发中遭遇过OpenMP(开放式多处理)静态库链接失败?是否因交叉编译环境差异导致"undefined reference to omp_"错误?本文将系统解决这些痛点,通过10个实战步骤+5个避坑指南,帮助你在Xmake构建系统中完美实现Android动态库与OpenMP静态库的链接,提升计算密集型应用性能最高达8倍。 读完本文你将掌握: - OpenMP在And...

gitblog_01406的博客 836

cocos2dx安卓打包与调试(适用quick3.5)

本方法适用于quick3.5项目的打包,在其他版本的cocos2dx中可能部分适用。 需要的工具   android ndk   android sdk   ant 安装以上工具的方法可以自行百度,安装完毕后,在quick-3.5目录下执行命令行,运行setup.py(需要安装python),完成项目的配置(告诉cocos上面这些工具在哪,打包的时候,cocos就会找到并使用它们)

yaoxiaoyang的博客 2683

Android14之解决报错:libncurses.so.5与libtinfo.so.5缺少问题(二百零九)

本篇目的:Android14之解决报错:libncurses.so.5与libtinfo.so.5缺少问题在Linux系统中,和是与终端处理相关的动态链接库。以下是这两个库的作用介绍:是ncurses库的一个版本。ncurses是一个程序库,它提供了在类UNIX系统上构建文本用户界面(TUI)的功能。这个库继承自最初的curses库,并添加了新的功能。ncurses库用于在终端中创建窗口、屏幕定位、字符处理以及屏幕刷新等功能。这些功能对于开发如文本界面游戏、终端用户界面和屏幕绘图程序等应用至关重要。

Android系统攻城狮 3548

Unity Android 加载动态库

前言在接入360 Android SDK时遇到在有些机型的Android机器上报错,具体错误提示为: Failure to initialize! Your hardware does not support this application Unity生成的原生包可以正常运行,那问题很明显出在360 SDK身上。遇到问题时,我的习惯首先是去想自己哪里有问题,排除掉自身原因,在找其他问题。翻看了

武龙飞的空中楼阁 4509

Android 10 根文件系统和编译系统(十二):Android.mk编译java动态库

配套系列教学视频链接: Android 10.0 AOSP源码编译: AOSP源码开发环境搭建教学视频-百问100ask Android系统 10.0 AOSP源码编译--优快云程序员研修院 Android 10.0 根文件系统和编译系统: Android根文件系统和编译系统教学视频-百问100ask Android 10.0 根文件系统和编译系统-优快云程序员研修院 说明 系统:AOSP Android10...

ldswfun的专栏 641

android 动态库放哪里

我整理的一些关于【动态库,Android,加载】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/eDOcp1Android 动态库放哪里?详解动态库的存放和使用 在Android开发中,动态库(Shared Library)是一个非常重要的组成部分。它允许开发者将一些通用的功...

weixin_37076141的博客 276

android 动态库加载机制

省流:android 不兼容 glibc,而是写了一套独立的 c 运行时库 (bionic libc),为移动设备和 google 自己推的东西做了大量优化。在这套工具链里,aosp 实现了一个兼容 bionic libc 的链接器,放到系统中代替 ld。​​​Android动态库的加载原理,真的理解了吗?一文带你游览动态库的加载流程,从 Java 到 C++,一步一步探索知识的 - 掘金。开始,执行流通过 jni 跳转到了 c 函数。好像有点跑题了,我都忘了在哪看到的。,往里跟踪的其他 c 文件。

dilvx的博客 889

Android编写C代码调用第三方动态库(例如:libopencv_java3.so)

1.本贴说明 写了这么多年Android,没有认真写过帖子,感觉挺遗憾的,称着新冠病毒猖狂在家无聊,写一篇帖子,打发下时间。本帖使用opencv2.4的头文件以及动态库,并非集成opencv的java api 2.准备 1.AndroidStudio3 2.libopencv_java3.so,以及opencv2.4的头文件,opencv2.4自己去官网下载,可能很慢,一定要下载OpenCV-an...

m0_37388625的博客 2742
上一篇: 基于Linux开源VOIP系统LinPhone[四]
下一篇: 基于Linux开源VOIP系统LinPhone[五]
wang-bob
博客等级 码龄20年 356粉丝 112原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值