0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Prelink的交叉编译和使用详解

如意 来源:CSDN 作者:CaspianSea 2020-06-20 12:03 次阅读

How to prelink?

1. Prelink 的交叉编译

1.1 获取源码

原版的 prelink 不适用于嵌入式平台;需要使用 Yocto Project 下的 prelink-cross 版本:

也可以通过 git 获取最新的源码:

$ git clone https://git.yoctoproject.org/git/prelink-cross

$ cd prelink-cross

$ git checkout 20151030_cross

注意,需要切换到 cross 分支。

1.2.交叉编译

prelink 工具类似于 gcc 等工具链,如果处理的 ELF 文件所属系统架构不同于宿主系统架构(也就是当前的操作系统),则需要指定交叉编译参数。例如,如果目标软件运行的平台为 arm,需要将 -target 参数指定为 arm-linux

此外,还需要加上 –without-sysroot 参数,使得我们编译出来的 prelink 工具可以在运行时指定 sysroot 路径。

Prelink的交叉编译和使用详解

2. Prelink 的使用详解

针对目标程序 target_bin 的 prelink 过程如下:

Prelink的交叉编译和使用详解

对于上述 prelink 过程所用到的重要参数解释如下:

–root 选项指定包含目标程序和系统共享库的 sysroot 路径,也就是嵌入式系统的根目录拷贝到宿主操作系统上的路径;后续所有路径都可指定为 sysroot 的相对路径。上述操作中,–root 参数指定的目录,其层级结构应与板子上根目录层级结构一致:

Prelink的交叉编译和使用详解

–cache-file 参数用于指定prelink 建立索引过程中的 cache 文件;

–config_file 参数用于指定 prelink 的配置文件,默认为 /etc/prelink.conf 。里面是所有需要进行 prelink 的 ELF 文件路径;如果 prelink 后加 -a 选项,则会处理此文件中所有的目录或文件;

–ld-library-path 参数用于指定目标可执行文件运行时的共享库搜索路径。由于我们需要从 target_bin 开始进行 prelink,因此指定其运行时的 LD_LIBRARY_PATH。

-h 和 -l 参数用于指定对目录为目录的软连接的不同处理方式;加 -h 参数时,会处理软链接文件指向的目标目录;加 -l 参数时,如果目标目录跨文件系统,则会忽略。

-b 参数用于添加黑名单,所有用 –b 参数指定的目标都不会处理。

-a 参数表示会处理配置文件中所有添加的路径或文件。

-m 节省虚拟定址分配;如果有大量的共享库需要 prelink 就会需要这个选项。

-R 参数会为共享库选择随机的基址;这个是为安全考虑。

-f 强制重新 prelink 已经做过 prelink 的 ELF 文件。prelink 默认会忽略之前已经被 prelink 的 ELF 文件。

-v 参数表示会输出中间的详细处理过程。

其他参数的解释请参考 man 手册。

单个可执行文件的 prelink 处理时间在秒级,如果对整个系统进行 prelink,可能要花几分钟或者十几分钟。

这里需要注意,使用 prelink 处理多个可执行文件时,如果每个文件运行时的动态库搜索路径不同,建议通过指定 LD_LIBRARY_PATH 来分别处理,而非通过 -a 参数一次性处理,否则可能会 prelink 错误的共享库,导致运行时 prelink 机制并没能发挥作用。

如果需要取消已经做过 Prelink 的 ELF 文件的,也非常简单:

1$ prelink -au

警告:在对本机的 ELF 文件进行 prelink 处理过程中,如果被强制中断,可能会将整个系统弄崩掉。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Prelink
    +关注

    关注

    0

    文章

    2

    浏览量

    1611
收藏 人收藏

    评论

    相关推荐

    嵌入式开发中的交叉编译详解

    在嵌入式开发中,经常会遇到目标平台资源贫乏,无法运行需要的编译器。亦或是目标平台上不允许或不能够安装需要的编译器。这时候就需要使用交叉编译了。
    的头像 发表于 12-01 13:24 454次阅读
    嵌入式开发中的<b class='flag-5'>交叉</b><b class='flag-5'>编译</b><b class='flag-5'>详解</b>

    什么是交叉编译交叉编译器又是什么呢

    嵌入式 Linux 编程嵌入式应用开发嵌入式软件开发流程什么是交叉编译在一种平台上编译出能在另一种平台(体系结构不同)上运行的程序;在PC 平台(X86) 上编译出能运行在ARM平台上
    发表于 12-22 07:30

    什么是交叉编译?为什么要交叉编译

    什么是交叉编译交叉编译是在一个平台上生成另一个平台上的可执行代码(例如我们在windows上用keil编译代码生成hex文件,供51单片机使
    发表于 01-13 06:04

    QT/E和Qtopia的编译详解

    首先说说编译PC上的QT/E,我起初的时候不知道编译PC上的QT/E编译qpe和交叉编译后的qpe有什么不同,
    发表于 05-10 10:53 2712次阅读

    基于Windows平台VxWorks交叉编译工具设计

    交叉编译技术,就是一种在一个异构平台上编译出目标平台程序的技术。比如在PC平台(X86 CPU)上编译出能运行在以VxWorks为内核的CPU平台上的程序,
    发表于 06-29 11:55 2090次阅读

    交叉编译linux内核(raspberry_3.6.y)

    一步一步教你交叉编译linux内核,RPI的内核编译教程,小众的东西了
    发表于 11-03 17:58 0次下载

    交叉平台开源编译系统_cmake入门

    交叉平台开源编译系统_cmake入门
    发表于 01-22 13:59 9次下载

    嵌入式交叉编译环境的搭建解析

    5.1.1 嵌入式交叉编译环境的搭建 交叉编译的概念在第4章中已经详细讲述过,搭建交叉编译环境是
    发表于 10-18 16:44 1次下载

    arm-linux的交叉编译环境解析

    交叉编译环境介绍 交叉编译是嵌入式开发过程中的一项重要技术,它的主要特征是某机器中执行的程序代码不是在本机编译生成,而是由另一台机器
    发表于 10-31 11:26 7次下载

    一文了解Prelink的注意事项

    需要被 Prelink 的 ELF 文件,无论是共享库还是可执行文件,编译时必须加 -fpic/-fPIC 参数,生成目标无关地址代码。对于可执行文件,不能使用 -fpie/-fPIE 加 –pie 生成地址无关可执行文件,否则无法被
    的头像 发表于 06-22 08:31 3658次阅读
    一文了解<b class='flag-5'>Prelink</b>的注意事项

    交叉编译器安装教程

    交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架构“交叉”起来了。Ubuntu 自带的 gcc
    的头像 发表于 09-29 09:12 2609次阅读

    QT如何配置交叉编译工具?

    交叉编译工具安装 (glibc版本需要和开发板上的版本相兼容)
    的头像 发表于 10-28 09:31 1959次阅读

    Go工程化-交叉编译概述

    交叉编译,也称跨平台编译,就是在一个平台上编译源代码,生成结果为另一个平台上的可执行代码。
    的头像 发表于 05-22 17:15 400次阅读

    Linux交叉编译选项与源码与目标文件分离

    交叉编译选项 编译Linux,通常只需要运行 make menuconfig 配置要编译的模块,然后运行 make 。Linux默认是做本地编译
    的头像 发表于 09-27 11:48 392次阅读

    QT开发学习笔记1(安装交叉编译器)

    QT安装交叉编译
    的头像 发表于 02-18 10:02 317次阅读
    QT开发学习笔记1(安装<b class='flag-5'>交叉</b><b class='flag-5'>编译</b>器)