ROM LIB

安卓ROM定制与GSI移植:深入解析lib与so文件的关键作用与实战修复 本文深入解析安卓ROM定制与GSI移植中lib与so文件的关键作用,提供实战修复方案。从基础认知到关键功能模块详解,涵盖音频、相机、传感器等核心组件的so文件配置与问题排查,分享二进制修改技巧与多架构适配策略,助力开发者高效解决系统移植中的兼容性问题。 阅读详情

概述

ROM Library(ROM库)是嵌入式系统中一种特殊的代码组织形式,其核心思想是将稳定且不常修改的功能模块(如通信协议栈、数学库、硬件驱动)预先编译为二进制代码,并固定烧录到芯片的Flash/ROM区域。应用程序运行时,通过地址跳转或符号引用直接调用ROM库中的函数和访问其数据。与普通静态库(.a文件)不同,ROM库的代码和数据不链接到应用程序中,而是独立存在,应用程序仅引用其地址。

对于C语言开发者可能比较难理解这个过程,但对于有一些汇编开发基础就比较容易理解调用过程,这是由于C语言的抽象层将硬件细节(地址、内存布局)隐藏在编译器和链接器背后,而ROM库的实现恰恰需要开发者直面这些底层机制。汇编开发者由于长期与地址、寄存器、物理内存打交道,对ROM库的固定地址分配、显式初始化和符号绑定方式有天然的熟悉感。因此,理解ROM库的关键在于突破高级语言的抽象层,深入掌握链接脚本、内存映射和符号解析机制。对于C开发者,通过学习嵌入式系统的底层原理(如阅读.map文件分析内存分配),可以逐步缩小这一理解差距。

以下以STM32CubeIDE和STM32L432为例,详细阐述如何生成ROM LIB固件以及如何使用ROM LIB固件。

存储器规划

STM32L432内部FLASH以及RAM资源如下:

范围大小
FLASH0x8000000~0x803ffff256KB
RAM0x20000000~0x2000bfff48KB
RAM20x10000000~0x10003fff16KB

ROM lib固件使用资源如下:

范围大小
FLASH0x8032000~0x803ffff56KB
RAM20x10000000~0x10003fff16KB

生成ROM LIB固件

链接文件

/* Entry Point */
ENTRY(RomLib_Init)


/* Memories definition */
MEMORY
{
  RAM2    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 16K
  FLASH    (rx)    : ORIGIN = 0x8032000,   LENGTH = 56K
}

/* Sections */
SECTIONS
{
  /* The program code and other data into "FLASH" Rom type memory */
  .text : ALIGN(4)
  {
    FILL(0xff)
    KEEP(*(.ROM_LIB_CODE)) /* do not discard anything marked as ROM Lib code */
    KEEP(*(.ROM_LIB_CONST)) /* do not discard anything marked as ROM constant */
    *(.text*)
    *(.rodata .rodata.* .constdata .constdata.*)
    . = ALIGN(4);
  } >FLASH

  /* Initialized data sections into "RAM" Ram type memory */
  .data : ALIGN(4)
  {
	FILL(0xff)
	KEEP(*(.ROM_LIB_RAM))
	*(.data*)
	. = ALIGN(4) ;
  } >RAM2 AT>FLASH

  /* Uninitialized data section into "RAM" Ram type memory */
  .bss : ALIGN(4)
  {
    _bss = .;
    *(.bss*)
    *(COMMON)
    . = ALIGN(4) ;
    _ebss = .;
  } >RAM2 AT>RAM2
}

在链接文件中定义了三个段:.text段、.data段、.bss段,.text段存储可执行代码和只读数据(如常量),通常位于Flash中;.data段保存已初始化的全局/静态变量,其初始值从Flash拷贝到RAM运行;.bss段存放未初始化或零初始化的全局/静态变量,由启动代码在RAM中清零后使用。这三个段分别管理代码、初始化数据和未初始化数据,确保程序高效利用Flash和RAM资源。

源文件


#include "RomLibFun.h"

#define ROM_LIB_CODE        __attribute__ ((section(".ROM_LIB_CODE"))) /* placed into ROM */
#define ROM_LIB_CONST       __attribute__ ((section(".ROM_LIB_CONST"))) /* placed into ROM */
#define ROM_LIB_RAM         __attribute__ ((section(".ROM_LIB_RAM"))) /* placed into RAM */

static int acc;
static int var_init = 10;
static const int data=12345;

ROM_LIB_CODE int RomLib_Acc(void)
{
	return ++acc;
}

ROM_LIB_CODE int RomLib_Add(int a,int b)
{
	return a+b;
}

ROM_LIB_CODE int RomLib_GetData(void)
{
	return data;
}

ROM_LIB_CODE int RomLib_GetVarInit(void)
{
	return var_init;
}

ROM_LIB_CODE void RomLib_Init(void)
{
	acc = 0;
}

头文件

#ifndef __ROMLIBFUN_H
#define __ROMLIBFUN_H

#ifdef __cplusplus
extern "C" {
#endif

#define ROM_LIB_CODE        __attribute__ ((section(".ROM_LIB_CODE"))) /* placed into ROM */
#define ROM_LIB_CONST       __attribute__ ((section(".ROM_LIB_CONST"))) /* placed into ROM */
#define ROM_LIB_RAM         __attribute__ ((section(".ROM_LIB_RAM"))) /* placed into RAM */

int RomLib_Add(int a,int b);
int RomLib_Acc(void);
int RomLib_GetData(void);
void RomLib_Init(void);


#ifdef __cplusplus
}
#endif

#endif

map文件分析

共包含3个段:.text、.data、.bss。.text段占124个字节包含RomLibFun.o中的4个函数(RomLib_Add、RomLib_Acc、RomLib_GetData、RomLib_Init);.data段占4个字节包含已初始化变量var_init;.bss段占用4个字节未初始化变量acc。map文件与源码定义一致。

text段

data段

bss段

使用ROM LIB

测试代码:

int main(void)
{

    /* USER CODE BEGIN 1 */
    int cnt = 0;
    /* USER CODE END 1 */

    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_USART2_UART_Init();
    /* USER CODE BEGIN 2 */
    HAL_Delay(100);
    printf("Start test Romlib...\r\n");
    RomLib_Init();
    printf("RomLib_Add12+11=%d\r\n",RomLib_Add(12,11));
    printf("RomLib_GetData=%d\r\n",RomLib_GetData());
    printf("RomLib_GetVarInit=%d\r\n",RomLib_GetVarInit());
    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
        printf("acc:%d\r\n",RomLib_Acc());
        HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
        HAL_Delay(1000);
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
    }
    /* USER CODE END 3 */
}

工程配置:

直接下载:

由于没有下载GEN_ROM_STM32L432,调用RomLib_Init后就出现了异常。

再下载GEN_ROM_STM32L432中的hex到Flash中:

运行正常,但是RomLib_GetVarInit的返回值并不符合我们的预期,这是由于RomLib_GetVarInit返回的是全局初始化变量,存在data段中,一般情况需要从加载域加载初值,但是在ROM lib固件中这部分流程是缺失的,若需要初始化尽量才RomLib_Init实现变量的初始化。

调试ROM Lib

工程配置

ROM Lib仿真成功:

Android ROM开发之预制GMS GMS 简介GMS 的全称是 Google Mobile Services (GMS) 。它是 Google 开发的一系列 apk集合,这些 apk 都或多或少的依赖 Google 服务。它没有包含在 Android 的开源代码中,当然也就不能看到这些 apk 的实现代码。在整机开发中,如果目标客户是国外用户,那么往往就需要预制GMS。如果你是Android应用开发人员,那么本篇内容可能不适合你。 阅读详情

相关推荐

安卓ROM移植避坑指南:手把手教你识别和替换关键的lib/so文件(附常用so功能清单)

本文详细解析安卓ROM移植过程中关键so文件的识别与替换技巧,提供常见so文件功能清单及问题排查方法。通过实战案例演示如何修复相机无声等问题,并分享高级分析工具使用技巧,帮助开发者规避移植风险,提升系统稳定性。

weixin_28700593的博客 409

安卓ROM移植避坑指南:手把手教你识别和替换关键的lib-so文件(附常见功能对照表)

本文详细解析安卓ROM移植过程中关键lib-so文件的识别与替换方法,提供系统级解决方案和常见功能对照表。通过四步排查法、核心功能so文件详解及高级调试技巧,帮助开发者有效解决相机、蓝牙、音频等模块的兼容性问题,提升ROM移植成功率。

weixin_30367873的博客 349

安卓ROM移植避坑指南:手把手教你识别与替换关键lib库so文件(附常见功能对照表)

本文详细解析安卓ROM移植过程中关键so文件的识别与替换技巧,提供系统级修复方案。涵盖功能异常诊断、so文件获取策略、安全替换方法及深度调试技术,特别针对不同安卓版本和厂商定制化需求给出实用建议,帮助开发者高效解决移植难题。

weixin_42522964的博客 379

12- Library at ROM

Library at ROM

baron-周贺贺-代码改变世界ctw 549

基于STM32F407的摄像头(不带FIFO的OV7670)图像采集及LCD显示实验-笔记整理

硬件说明 STM32F4开发板 stm32f4系列的芯片处理的能力可以说非常强大了的,而且内部还自带有数字摄像头接口(DCMI),可以说stm32f407的核心板和不带FIFO的摄像头模块OV7670简直就是绝配! 我手上的这块张这个样子 (图片来源:某宝): F4系列的DCMI接口内部结构框图如下图3所示,具体的配置使用方式可以参考以下这篇博文:《stm32f4的数字摄像头接口(DCMI)使用》 这位博主大大已经很详细地介绍了DCMI接口的具体使用方法和原理,更重要的是里面还有接口的配置函数,虽然不完

LiangWF22的博客 2万+

Dify实战:智能邮件工作流配置全解析

本文详细解析了如何利用Dify平台配置智能邮件工作流,实现邮件处理的自动化与智能化。内容涵盖从获取邮箱授权、安装插件、安全配置环境变量,到构建邮件发送工作流、创建调用该工作流的智能体(Agent)的完整步骤,并分享了连接知识库实现智能客服、定时发送日报等进阶自动化场景,旨在帮助用户显著提升邮件处理效率。

t8u9v0w1x的博客 795

MetaWRAP:灵活的宏基因组数据分析管道

MetaWRAP:灵活的宏基因组数据分析管道 项目介绍 MetaWRAP 是一个易于使用的宏基因组分析工具套件,旨在从头到尾完成宏基因组分析的核心任务:读取质量控制、组装、可视化、分类学分析、提取草稿基因组(分箱)以及功能注释。此外,MetaWRAP 在分箱提取和分析方面提供了更高级的功能(详见下文模块概述)。虽然处理宏基因组数据没有单一的最佳方法,但 MetaWRAP 旨在提供一个快速且简单的分...

gitblog_00008的博客 717

通达信缠论中枢自动识别与画线实战指南

本文详细介绍了通达信缠论中枢自动识别与画线公式的实战应用。该工具通过严谨的算法逻辑,自动在K线图上标记出符合缠论定义的中枢区间,帮助投资者摆脱繁琐的手工画图,聚焦于价格与中枢的互动关系,从而高效识别趋势延续、背驰及第三类买卖点,提升缠论分析与交易决策的效率。

weixin_29267307的博客 662

ATF(Arm Trusted Firmware)/TF-A Chapter 05 BL2

写在最前 二级boot的实现方案有很多,比如bl2,u-boot、uboot-spl, uefi。 bl2的主要职责就是将后续固件如u-boot。kernel,SCP或者其他异构核的固件,加载到ram中。 对于一个ARMv8架构的Core,比如A35,A53,A7x来说,大部分SoC设计厂商会使用ARM推荐的启动方式:ARMv8 AARCH64,Single Core Boot。 这样,Cold boot是,EL3,ARMv8 Aarch64,加载bl2,可...

kunkliu的博客 2319

SAP生产订单(创建-下达-发料-报工-入库)全流程及反向流程

SAP创建下达报工入库发料以及取消发料取消入库,批量下达删除关闭,生产订单出入库查询和状态更改查询记录

weixin_38974136的博客 2万+

sylar学习系列一

开发环境 Centos7最小系统 gcc 9.1 cmake 环境可能存在的一些问题 可能存在的问题,linux最小系统没有一些常用命令,如果我们处于外网我们可以yum安装,但却遇到以下问题 can not find a valid baseurl for repo: base/7/x86-64 可修改网络配置 vi /etc/sysconfig/network-scripts/ifcfg-ens123 # 不是每个主机都是ens123 把ONBOOT=no,改为ONBOOT=yes 重启网络

wuguinianjing的博客 1018

ATF(Arm Trusted Firmware)/TF-A Chapter 02 BL1-ROMCode - Continued(1)

第二章目录: Chapter 02.TF-A(Arm Trusted Firmware, ATF ) BL1-ROMCode Chapter 02.TF-A(Arm Trusted Firmware, ATF ) BL1-ROMCode - Continued(1) (本文) Chapter 02.TF-A(Arm Trusted Firmware, ATF ) BL1-ROMCode - Continued(2) 下一章: Chapter 03.TF-...

kunkliu的博客 967

Jetson Orin NX 单目标跟踪算法实战

本文对比了NanoTrack和MixFormerV2两种目标跟踪算法在Jetson Orin NX边缘设备上的实际表现。通过天空小目标跟踪场景测试发现,NanoTrack虽然表征能力较弱,但具有目标身份一致性强、失败模式可控、计算负担小等优势,更适合作为边缘端默认算法。MixFormerV2则适用于高速运动等特定场景。实验数据显示NanoTrack在Orin NX上可达200FPS,远高于MixFormerV2的38-120FPS。建议先采用NanoTrack构建稳定系统,后续再评估复杂算法的适用性。

karmueo46的博客 625

安卓修改rom 固件 修改GSI 移植rom 必备常识 lib--**so文件基本解析

安卓系统lib-so文件。

小马哥的专栏 3121

IPCP(IP Control Protocol,IP控制协议)

IPCP(IP Control Protocol,IP控制协议)

天赐好车的博客 756

配置 SAP ABAP Secure Storage

系统在进行数据加密时,会将数据与当前 Key ID 进行关联,也就是说,如果此时使用的是 Key ID 4713,则该条数据会在 Encrypt.Data 字段存储一个由密钥 4713 加密后的密文。Key ID 代表了不同的密钥标识,Current Key 表示系统当前正在使用的主密钥,Value 则是对应密钥的存储值,Management Data 通常包括一些管理性或辅助性的信息,用于描述密钥的状态、过期时间或者其他属性。对于每一条被加密的业务数据,系统会记录它使用了哪一条 Key ID。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 565

KEILE中生成个人lib库总结

Keil中如何使用自己生成的LIB库 代码积累多了,大家可能都尝试过自己写个库,方便调用,我最初的办法是把常用的函数放到一个个.C文件里头,要用的时候就把一个个.C添加到Group里面,这种方法就很麻烦了,每次新建一个工程都要ADD半天 这里8279.C,delay_ms.c,watchdog.c,function.c都是我以前写过现在拿来重用的代码 这样做还有一个问题,如果某个函数未

zhangjikuan的专栏 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

keil中lib的生成与使用

http://wenku.baidu.com/view/f4dab93f5727a5e9856a6192.html   你可能已经很熟悉keil的使用了,但keil中有一个比较重要且很实用的文件,不知道你注意到没有?那就是lib文件。  lib为什么重要?说说它的特点你就自然会明白。  1、维护自己写的代码不被别人乱改动。lib不是c代码,不能对它编辑,只能通过.h文件调用。所以为了别人

fyfy 2097

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

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

百度云ROM移植教程

这是基于MTK平头的  ,应该高通的移植起来差不多 百度云ROM移植教程(基于MTK6577) 百度云已经有了MTK6577平台的ROM A789,基于A789,我们可以将百度云ROM移植到其他的MTK6577的机型上。类似的可移植机型还有:联想P700i、联想A800、联想A660、联想s850e、金立GN700W、金立C700、金立C610、纽曼N1、中兴V889M

sdgaojian的专栏 2190

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[经验技巧] Android移植中部分重要lib库文件作用

对于想要学习移植的朋友,我这里把我了解的部分lib告诉大家。 这些库文件,主要是一些移植中卡屏所能涉及到的! 主要是我从移植中遇到部分问题所了解到,并且查各种资料得出的结论,可能和网上的部分资料不同,大神勿喷! 1、libgui.so与libsurfaceflinger.so相关,而libsurfaceflinger.so负责的是框架层数据 2、libhardware_legacy.s

Decisiveness的专栏 2890

Android ROM打包输入法

比如:百度输入法、讯飞输入法 以百度输入法为例吧。 用winrar之类的压缩工具打开该输入法的应用 *.apk 里面有一个/lib/armeabi/目录,该目录下有一个libinputcore.so的共享库文件,你做ROM的时候要把这个libinputcore.so放到ROM的/system/lib/目录下,将输入法的安装包放到/data/app目录或/system/app目录下(两者

Kevin Meng 1891

Synopsys DC .lib 转 .db文件

但foundary生成的 ROM等只有 lib文件。方法: 读取 lib文件, 写成 db文件。在DC综合时,会用到 db文件。

_Seeker 1710

DC综合时Memory(ram、rom)的处理

本文将会讲解如何对DC综合的memory(ram、rom)进行处理。

m0_45287781的博客 9106

解决WinCE下的Windows目录文件不丢失的问题

1.将RAM and ROM File System模式改成ROM-only File System._________编译遇到问题BUILD: [01:0000006538:PROGC ] Linking D:\WINCE600\platform\SMDKV210\target\ARMV4I\retail\pm.dllBUILD: [00:0000006562:WARNN ...

weixin_34241036的博客 175

Platform Builder5.0编译问题集合(更新中~~~)

板子是OK2440Ⅳ,在编译时候出出现各种问题,再次罗列一下! 1. NMAKE : U1073: don't know how to make 'D:\WINCE500\public\common\sdk\lib\ARMV4I\retail\ndis.lib'       解决:修改D:\WINCE500\PLATFORM\SMDK2440A\Src\Drivers\DM9000A中的sou

michaelyue526的专栏 1189
上一篇: AGNSS仅仅只是加快首次定位时间吗--AGNSS原理
下一篇: 无线功率单位:dB、dBm 以及 dBm/MHz 全解析
老Z先生
博客等级 码龄4年 417粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值