LOCAL_PRELINK_MODULE
Prelink利用事先链接代替运行时链接的方法来加速共享库的加载,它不仅可以加快起动速度,还可以减少部分内存开销,
是各种Linux架构上用于减少程序加载时间、缩短系统启动时间和加快应用程序启动的很受欢迎的一个工具。程序运行时的
动态链接尤其是重定位(relocation)的开销对于大型系统来说是很大的。
动态链接和加载的过程开销很大,并且在大多数的系统上, 函数库并不会常常被更动, 每次程序被执行时所进行的链接
动作都是完全相同的,对于嵌入式系统来说尤其如此。因此,这一过程可以改在运行时之前就可以预先处理好,即花一些时间
利用Prelink工具对动态共享库和可执行文件进行处理,修改这些二进制文件并加入相应的重定位等信息,节约了本来在程序
启动时的比较耗时的查询函数地址等工作,这样可以减少程序启动的时间,同时也减少了内存的耗用。
Prelink的这种做法当然也有代价:每次更新动态共享库时,相关的可执行文件都需要重新执行一遍Prelink才能保
证有效,因为新的共享库中的符号信息、地址等很可能与原来的已经不同了,这就是为什么 android framework代码一改动,
这时候就会导致相关的应用程序重新被编译。
这种代价对于嵌入式系统的开发者来说可能稍微带来一些复杂度,不过好在对用户来说几乎是可以忽略的。
--------------------
变量设置为false那么将不做prelink操作
LOCAL_PRELINK_MODULE := false
默认是需要prlink的,同时需要在 build/core/prelink-linux-arm.map 中加入
libhellod.so 0x96000000
这个map文件好像是制定动态库的地址的,在前面注释上面有一些地址范围的信息,注意库与库之间的间隔数,
如果指定不好的话编译的时候会提示说地址空间冲突的问题。另外,注意排序,这里要把数大的放到前面去,
按照大小降序排序。
解析 LOCAL_PRELINK_MODULE 变量
build/core/dynamic_binary.mk:94:ifeq ($(LOCAL_PRELINK_MODULE),true)
ifeq ($(LOCAL_PRELINK_MODULE),true)
$(prelink_output): $(prelink_input) $(TARGET_PRELINKER_MAP) $(APRIORI)
$(transform-to-prelinked)
transform-to-prelinked定义:
./build/core/definitions.mk:1002:define transform-to-prelinked
define transform-to-prelinked
@mkdir -p $(dir $@)
@echo "target Prelink: $(PRIVATE_MODULE) ($@)"
$(hide) $(APRIORI) /
--prelinkmap $(TARGET_PRELINKER_MAP) /
--locals-only /
--quiet /
$/build/tools/apriori”
参考文档:
动态库优化——Prelink(预连接)技术
http://www.eefocus.com/article/09-04/71629s.html
分享到:
相关推荐
LOCAL_ARM_MODE := arm LOCAL_PRELINK_MODULE := false LOCAL_CPPFLAGS := \ -DWITH_DOM -DWITH_OPENSSL \ -D__ANDROID__ \ -DNULL=0 -DSOCKLEN_T=socklen_t -DNO_SSTREAM -DBSD=1 -DNO_SSTREAM -fexceptions -...
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
Prelink是一种针对Linux系统的优化技术,旨在加速程序启动和系统加载。它的工作原理主要涉及到以下几个核心方面: 1. **缓存符号解析结果**:在程序运行之前,Prelink预先进行符号解析,将程序中未定义的函数名转换...
LOCAL_PRELINK_MODULE := false LOCAL_MODULE := libhello LOCAL_CFLAGS += -DHAVE_LOG include $(BUILD_SHARED_LIBRARY) ``` 5. 在 Android 应用的主活动中调用 `TestHelloLib` 类的 `printHello()` 方法。例如...
`LOCAL_C_INCLUDES`添加了额外的头文件搜索路径,而`LOCAL_CFLAGS`设置了编译选项,如`-MD`用于生成依赖文件,`-FF`、`-Uarm`、`-DMODULE`、`-D__LINUX_ARM_ARCH__=7`是特定的编译标志。`LOCAL_MODULE`定义了生成的...
`LOCAL_PRELINK_MODULE`设置为`false`表示不进行预链接,`LOCAL_MODULE`定义模块名称,最后包含`BUILD_SHARED_LIBRARY`以构建共享库。 `lights.c`文件中,定义了`HAL_MODULE_INFO_SYM`结构体,初始版本中`methods`...
用于与 PreLink 实验室信息系统交互的 SOAP Web 服务客户端 配置 在 config/ 下创建一个 prelink.yml 文件,其中包含以下详细信息: wsdl_url - The URL for the WSDL of the PreLink Server station_id - Your ...
TARGET_PRELINK_MODULE := false include $(BUILD_SHARED_LIBRARY) ``` 编译后的输出文件会放置在不同的目录下,具体如下: - 可执行文件:`out/target/product/generic/obj/EXECUTABLE` - 静态库:`out/target/...
LOCAL_PRELINK_MODULE := false LOCAL_SRC_FILES := src/lex.yy.c \ src/y.tab.c \ src/alias.c \ src/boa.c \ src/buffer.c \ src/cgi.c \ src/cgi_header.c \ src/config.c \ src/escape.c \ src/get.c...
LOCAL_PRELINK_MODULE := false LOCAL_MODULE := my_jni LOCAL_SRC_FILES := client_agent.cpp \ client_makehole.cpp LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog include $(BUILD_SHARED_LIBRARY) ``` - `...
通过预链接(prelinking)和符号链接(symbolic linking),prelink使得项目能够更干净、更独立地管理其源代码。 预链接(prelinking)是一种技术,它允许开发者在构建过程中预先建立模块之间的关联,这样在运行时...
TARGET_PRELINK_MODULE := false include $(BUILD_SHARED_LIBRARY) ``` 编译后的可执行程序、动态库和静态库会被放置在特定的文件夹中: - 可执行程序:`out/target/product/generic/obj/EXECUTABLE` - 动态...
通过设置`LOCAL_MODULE_PATH`和`LOCAL_UNSTRIPPED_PATH`等变量,可以指定不同类型的文件应该被安装到哪个文件系统下的具体位置。例如,可执行程序通常会被安装到`/system/bin`目录下,而动态库则可能会被放置在`/...
为了不落后,Linux必须采用专家级别的方法来减少服务、字体和功能,保持系统的轻量化和流畅性。 为了达到快速启动的目标,吴博士提出了几个主要方案。首先是使用bootchart来分析系统的启动过程,找出瓶颈所在。...
2. `postlink.bat` 和 `prelink.bat`:这两个批处理文件分别在链接阶段前后执行,可以用于编译后的定制操作,例如资源的复制、符号链接的创建或优化步骤。 3. `usbcam.bib`:在编程中,BIB通常代表参考文献文件,但...
来自BEST-BOTS.COM的免费启动程序最快的早期链接添加到购物车中允许用户添加早期的Nike链接,并在产品可用时使用高级编码(XML格式)添加到购物车中,同时具有高级TWITTER和40项功能 支持语言:English (United ...
strip 工具也没有采用常用的 strip,即“/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin”目录下的 arm-eabi-strip,而是位于/out/host/linux-x86/bin/的 soslim 工具。 在 Android 中编译 Native C 的 hello...
其中,`LOCAL_SRC_FILES`定义了需要编译的源文件,`LOCAL_MODULE`指定了动态库的名称,而`LOCAL_PRELINK_MODULE`和`BUILD_SHARED_LIBRARY`则分别用于控制预链接行为和指示构建共享库。 ##### 3. 编译动态库 在`lib...