`

linux进程Prelink

阅读更多

什么是 Prelink ? 它能为我做什么 ?

       许多的应用程式使用共用函式库. 在这些程式被执行的时候, 共用函式库会被读进记忆体中, 并且跟程式中所参用到的符号(symbol)连结起来. 对大多的小程式而言, 通常这样的动态连结非常快. 但是对一些依存於大量函式库的 C++ 程式而言, 动态连结却可能花上不少的时间.

       在大多数的系统上, 函式库并不会常常被更动, 每次程式被执行时所进行的连结动作都是完全相同的,Prelink 利用这点, 将程式与函式库连结的方式弄出来记录在执行档中, 达成"预先连结"的效果. 你需要 glibc 中的 ld-linux.so 来进行连结, 要能够认出"预先连结"的纪录则需要 >=glibc-2.3.1-r2.

       "预先连结"能够节省应用程式的启动时间. 以典型的 KDE 程式为例, 程式的读取时间能够减少 50% 那么多. 唯一必要的维护只有每当被"预先连结"过的执行档所连结到的函式库有所更新时, 需要再次执行 prelink.

摘要

    * 我们可以用一个就叫做 prelink 的程式来进行"预先连结". 它能够修改执行档的内容, 使启动的时间变短.
    * 如果某个"预先连结"过的应用程式所依存的函式库有所变动, 你必须重新"预先连结"这个应用程式, 不然速度上的增快将继续无法作用. 也就是说, 每次你用 portage 更新一些套件而更新了一些函式库, 这些函式库必须重新被"预先连结"起来.
    * 对执行档的更动是完全可逆的. prelink 拥有复原的功能.
    * 新版的 Portage 能够应付 prelink 对执行档的 MD5sum 与 mtime 造成的改变.
    * 你需要 glibc-2.3.1-r2 或更新版本, 以及 binutils-2.13.90.0.xx 或更新版本所编 译出的执行档.

2. 设定 Prelink



安装所需程式

注释: 我们假设你的系统是 Gentoo-1.4, 并且是使用 gcc-3.2 与 binutils-2.13.90.0.xx 以后版本编出来的. 这样编出来的执行档才能够进行"预先连结".

警告: 你必须已经安装了 glibc-2.3.1-r2 或更新的版本, 不然 prelink 会搞烂你的执行档!

       先更新你的 portage tree, 因为大多数需要用到的程式都还新, 而常常加入新的错误修正.

代码 2.1: 更新你的 portage tree

# emerge sync

       接下来确定你已经安装了 portage-2.0.46 或更新版本. 这样 portage 才能够认出"预先连结"过的执行档, 在使用者要反安装时才能正确移除. 需要这样做是因为"预先连结"会造成执行档的 MD5sum 值改变.

代码 2.2: 确保 Portage 的版本

# emerge ">=portage-2.0.46"

       现在你可以开始安装"预先连结"工具了. emerge 程式能够自动测试你的系统是否能够安全正常地进行"预先连结".

代码 2.3: 安装 Prelink

# emerge prelink

       有不少人在安装 prelink 的时候遭遇到测试失败的错误讯息. 这些测试是为了安全理由才被放上的, 如果你关闭这些测试, prelink 的行为将无法保证. 这些错误大多是由这些核心套件造成: binutils, gcc, 及 glibc. 试试看照以上顺序重新安装这些套件.

注释: 小提示: 如果你在尝试自行手动编译测试 prelink (./configure ; make ; make check )时遭遇到错误, 你可以察看 testsuite 目录中的 *.log 档案, 它们可能能给你一些有用的线索.

       如果你能提出一套能在多个系统上复现产生 emerge 错误的步骤, 请 e-mail 给 Stefan Jones.

组态设定

       Portage 会自动产生 /etc/prelink.conf 档告诉 prelink 哪些档案需要"预先连结".

       可惜的是你没办法"预先连结"旧版 binutils 编出来的程式. 大多这些来自预先编好, 执行档发布的套件都被安装在 /opt. 编写以下档案能告知 prelink 不要尝试去"预先连结"它们.

代码 2.4: /etc/env.d/99prelink

PRELINK_PATH_MASK="/opt"

注释: 你可以用冒号分隔加入更多的目录在这个清单中.

3. 进行"预先连结"



Prelink 使用方式

       我们可以用下列指令来"预先连结"所有列在 /etc/prelink.conf 中的目录里的执行档.

代码 3.1: 预先连结清单中的档案

# prelink -afmR

警告: 有人发现如果你在磁碟空间吃紧的时候"预先连结"系统上所有执行档, 你的执行档有可能会被截断, 这样会弄爆你的系统. 你可以用 file 或 readelf 来检查执行档的状态. 或者每次在进行"预先连结"前先用 df -h 检查硬碟的剩余空间.
每个选项的解说:
-a     "All": 对所有执行档进行"预先连结".
-f     强制 prelink 重新"预先连结"已经做过"预先连结"的执行档. 加上这个选项是因为 prelink 在看见做过"预先连结"的执行档的时候会 中止执行, 即使相依的函式库有更动过.
-m     节省虚拟定址分配. 如果你有一卡车的函式库要"预先连结"就会需要这个选项. (译注: 这里的原文 virtual memory space 是有问题的, 应该是 virtual address space 比较正确.)
-R     Random -- 用乱数进行定址分配, 这样可以增进安全性对缓冲区溢出(buffer overflow) 攻击的抵抗能力.

注释: 如想知道更多的选项细节, 请见 man prelink.

4. 已知问题与处理



"Cannot prelink against non-PIC shared library"

       这个问题是由那些没有使用 -fPIC gcc 选项编译全部目的档(object file)的问题函式库所造成.

       以下是一份问题函式库, 以及当你遇到上述问题时需要重新安装的对应套件.

代码 4.1: 修正

// 对 ORBit 函式库, /usr/lib/libIIOP.so.0.5.17
# emerge ">=sys-apps/tcp-wrappers-7.6-r4" ORBit// 对 zlib 函式库, /usr/lib/libz.so.1.1.4
# emerge ">=sys-libs/zlib-1.1.4"// 对 svgalib, /usr/lib/libsvga.so.xx
# emerge ">=media-libs/svgalib-1.9.16"// 对 XFree openGL 函式库, libGLU.so.1
# emerge ">=x11-base/xfree-4.2.1-r2"// 对 libpcap.so.0.6
# emerge ">=net-libs/libpcap-0.7.1-r2"// 对 lcms 函式库, /usr/lib/liblcms.so.1
# emerge ">=media-libs/lcms-1.09"

注释: 许多函式库有静态连结到 zlib 与/或 tcp-wrappers, 所以先试著安装它们, 并重新安装问题函式库.

       如果你在"预先连结" QT/KDE 时遇到问题, 先试著更新到 >=x11-base/xfree-4.2.1-r2 与 >=x11-libs/qt-3.1.0-r1 套件. 如果 QT 还是不过的话, 则可以试著在 qt 的 ebuild 档中加上 myconf="-no-xinerama ${myconf}" 来编译不包含 xinerama 支援的 QT .

       这里有一些函式库是还没修正或是无法修正的:

    * wine 套件中的函式库, winex 也不例外. 但是"预先连结"本来就无法对 MS Windows 执行档进行加速.
    * media-video/mjpegtools 中的函式库 /usr/lib/liblavfile-1.6.so.0.

       如果你的问题函式库没有在列表中, 请回报, 最好能够附上一份为相映的 CFLAGS 加上 -fPIC 选项的修补档.

当对档案进行"预先连结"的时候发生中止, 像是 "1631 Aborted ...."

       你需要为 prelink 加上 -f 参数. 也就是说, 如果你要对整个系统重新进行"预先连结"的话, 用 prelink -af.

"<档名>: error while loading shared libraries: unexpected reloc type..."

       这个错误在 2002/11/18 时, 在 sys-libs/glibc-2.3.1-r2 中已修正了, 如果你还在用旧版本的话, 请重新安装 glibc.

       已知 prelink -u -a -m ; prelink -a -m 可能也有用. 如果这些方法都失败的话就 prelink -u <file> 吧.

我的 nVIDIA openGL 函式库发生问题

       nvidia-glx 套件中具有加速功能的 openGL 函式库是用非标准的方式编译出来的, 所以 prelink 会发出警告. 这没什么好担心的, 而且除了 nVIDIA 以外没有人能够进行修正. 如果你不需要 3D 加速的话, 你也可以随时换回 XFree 内建的 libGL.so. XFree 的 nvidia 驱动程式足以正常运作了.

当我对整个系统进行"预先连结"之后, 一些静态连结的执行档不会动了

       就 glibc 而言是没有 100% 的静态连结执行档这回事的. 如果你是用 glibc 静态编译了一个执行档, 则这个执行档还是有可能会依存其它系统档案. 以下是 Dick Howell 的解释.

       "我想你的想法是认为所有相依函式库都会在下载下来的档案之中(译注: 下载下来的静态连结执行档), 所以它不用依赖任何本地端的函式库. 但是很可惜的, 对於 Linux, 甚至我想对於任何使用 glibc 的系统, 这样的想法并不正确. 有个叫做 "libnss" 的东西 (名称服务选择 name service switch, 也有人管它叫网路安全系统, network security system), 它提供了一些处理认证资料库, 网路资讯, 以及一些其它东西的函式. 它被设计来使应用程式可以直接适应於不同的网路环境. 这是个聪明的设计, 但是使用不同系统的 glibc 却可能对它的载入造成问题. 但它又根据不同的系统设定而有所不同, 所以你没办法对它作静态连结. 我想问题就是这样发生的, 程式静态连结了不同系统的 glibc 函式库, 主要是 "libpthread", "libm", "libc", 这些函式库对 "libnss" 呼叫了不相容的函式."

Prelink 发出 "prelink: dso.c:306: fdopen_dso: Assertion `j == k' failed." 并中止了

       这是个已知的问题, 这里 有亲切的解说. Prelink 没办法处理用 UPX 压缩过的执行档. 直到了 prelink-20021213 都还没有修正, 你只能在进行"预先连结"时把这些压缩过的执行档藏起来. 你可以参考上方的 组态设定 章节 来简单地完成这件事.

我使用 grsecurity 而"预先连结"似乎无法运作

       如果你要在一个使用 grsecurity 使 mmap() 基底位址乱数化(randomized mmap() base)的系统上使用"预先连结", 你必须把 /lib/ld-2.3.*.so 的 "randomized mmap() base" 设定关闭. 你可以用 chpax 公用程式来完成这个动作,但是这必须在该档没有在使用时才能进行. (比方说用救援光碟开机)

分享到:
评论

相关推荐

    Prelink--一种Linux下加速程序启动的技术研究.pdf

    Prelink是一种针对Linux系统的优化技术,旨在加速程序启动和系统加载。它的工作原理主要涉及到以下几个核心方面: 1. **缓存符号解析结果**:在程序运行之前,Prelink预先进行符号解析,将程序中未定义的函数名转换...

    前端开源库-prelink

    "prelink" 是一个前端开源库,它专注于解决这个问题,特别是在处理模块依赖时提供了一种高效的方法。通过预链接(prelinking)和符号链接(symbolic linking),prelink使得项目能够更干净、更独立地管理其源代码。 ...

    prelink:用于与 PreLink 实验室信息系统交互的 SOAP Web 服务客户端

    用于与 PreLink 实验室信息系统交互的 SOAP Web 服务客户端 配置 在 config/ 下创建一个 prelink.yml 文件,其中包含以下详细信息: wsdl_url - The URL for the WSDL of the PreLink Server station_id - Your ...

    boot_linux_faster.pdf

    Bootchart是一个工具,可以在Linux启动过程中记录系统负载和进程,帮助用户可视化启动过程并找出可以优化的部分。 另一个方案是通过prelink来加速动态链接过程。Prelink会对ELF格式的库和应用程序进行预链接处理,...

    prelink-0.5.0-9.el7.x86_64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    免费prelink耐克鞋机器人从最好的bots.com。「free prelink Nike shoe bot from best-bots.com」-crx插件

    允许用户添加一个早期的耐克链接,并将添加到购物车当产品可用。 来自BEST-BOTS.COM的免费启动程序最快的早期链接添加到购物车中允许用户添加早期的Nike链接,并在产品可用时使用...支持语言:English (United States)

    linux目录详解

    - `prelink.conf`:配置预连接行为,提高系统性能。 - **安全终端配置**: - `securetty`:指定允许进行文本模式登录的接口。 - **Shell 列表**: - `shells`:列出可用的 shell 类型。 - **权限配置**: - `...

    android中移植 c c++程序

    prelink 工具不是常用的 prelink,而是 apriori,其源代码位于” /build/tools/apriori”。strip 工具也没有采用常用的 strip,即“/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin”目录下的 arm-eabi-strip,...

    Unicore32架构下的Android系统链接加载优化.pdf

    实验结果显示,Prelink能够显著提升动态链接性能,最多可将系统进程链接加载时间降低51.47%。优化效果与程序依赖的动态库数量成正比,这意味着对于依赖大量动态库的应用程序,Prelink能更有效地缩短系统启动时间。 ...

    free prelink Nike shoe bot from best-bots.com-crx插件

    语言:English (United States) 允许用户添加早期的nike链接,并将添加到购物车添加到购物车(产品可用) free bot frees-bots.com 最快的早期链接加入购物车Bot 允许用户添加早期的耐克链接,并在产品可用时添加到...

    04_Android的底层库和程序-Android课件

    TARGET_PRELINK_MODULE := false include $(BUILD_SHARED_LIBRARY) ``` 编译后的输出文件会放置在不同的目录下,具体如下: - 可执行文件:`out/target/product/generic/obj/EXECUTABLE` - 静态库:`out/target/...

    【Android系统原理与开发要点详解】04_Android的底层库和程序

    TARGET_PRELINK_MODULE := false include $(BUILD_SHARED_LIBRARY) ``` 编译后的可执行程序、动态库和静态库会被放置在特定的文件夹中: - 可执行程序:`out/target/product/generic/obj/EXECUTABLE` - 动态...

    Android的底层库

    TARGET_PRELINK_MODULE := false include $(BUILD_SHARED_LIBRARY) ``` #### 四、编译与安装路径 - **编译模板的区别**:根据目标平台的不同,可以选择使用不同的编译模板。例如,对于Android平台的目标编译,...

    【优亿Android特刊】第二十二期:Android源码修改

    - **操作系统选择**:推荐使用Linux发行版,如Ubuntu,因为官方文档更倾向于Linux平台。 - **编译工具**:安装必要的编译工具和库,如`make`、`g++`等。 - **环境变量设置**:配置好`PATH`等环境变量。 **3. 三星...

    3d promgramming

    本文将深入探讨在3D编程领域中如何利用预链接技术(Prelink)来优化程序的启动时间,特别是针对采用动态链接的ELF格式程序。通过具体案例分析与技术原理介绍,帮助读者理解预链接技术的工作机制及其对提高程序启动...

    openssl-1.0.2o_android_arm64_jnilib

    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 -DANDROID -DXLOCALE_NOT_...

    如何隐藏SDK中的符号

    - 在Target的Build Settings中搜索“prelink”,将“Perform Single-Object Prelink”设置为“Yes”,并将所需的所有库文件直接拖到Prelink配置中。 - 这一步是确保在最终打包发布之前,所有带有`private_external...

    android系统-背光模块.pdf

    在Linux系统中,可以通过修改 `/sys/class/backlight/pwm-backlight/brightness` 和 `/sys/class/backlight/pwm-backlight/max_brightness` 这两个文件来调整亮度和最大亮度值。`brightness`文件控制当前亮度,而`...

    android的MK文件编写规范

    `LOCAL_C_INCLUDES`添加了额外的头文件搜索路径,而`LOCAL_CFLAGS`设置了编译选项,如`-MD`用于生成依赖文件,`-FF`、`-Uarm`、`-DMODULE`、`-D__LINUX_ARM_ARCH__=7`是特定的编译标志。`LOCAL_MODULE`定义了生成的...

Global site tag (gtag.js) - Google Analytics