精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    瀏覽量

    1618
收藏 人收藏

    評論

    相關推薦

    嵌入式開發中的交叉編譯詳解

    在嵌入式開發中,經常會遇到目標平臺資源貧乏,無法運行需要的編譯器。亦或是目標平臺上不允許或不能夠安裝需要的編譯器。這時候就需要使用交叉編譯了。
    的頭像 發表于 12-01 13:24 ?1153次閱讀
    嵌入式開發中的<b class='flag-5'>交叉</b><b class='flag-5'>編譯</b><b class='flag-5'>詳解</b>

    什么是交叉編譯?為什么要交叉編譯

    什么是交叉編譯交叉編譯是在一個平臺上生成另一個平臺上的可執行代碼(例如我們在windows上用keil編譯代碼生成hex文件,供51單片機使
    發表于 01-13 06:04

    QT/E和Qtopia的編譯詳解

    首先說說編譯PC上的QT/E,我起初的時候不知道編譯PC上的QT/E編譯qpe和交叉編譯后的qpe有什么不同,
    發表于 05-10 10:53 ?2822次閱讀

    交叉編譯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次下載

    Xilinx交叉編譯鏈的安裝步驟和驗證

    xilinx-arm-linux交叉編譯鏈最后一個版本就是2011版本,之后的xilinx不再單獨提供交叉編譯鏈了,如果需要最新的,請安裝SDK開發軟件,之后再安裝目錄中查找,或者so
    發表于 07-10 10:49 ?3153次閱讀

    ST微電子STM8的C交叉編譯用戶指南

    《STM8交叉編譯器用戶指南》是程序員為STM8微控制器環境編寫C程序的參考指南。它概述了交叉編譯器的工作原理,并解釋了如何編譯、組裝、鏈接
    發表于 06-04 08:00 ?12次下載
    ST微電子STM8的C<b class='flag-5'>交叉</b><b class='flag-5'>編譯</b>用戶指南

    一文了解Prelink的注意事項

    需要被 Prelink 的 ELF 文件,無論是共享庫還是可執行文件,編譯時必須加 -fpic/-fPIC 參數,生成目標無關地址代碼。對于可執行文件,不能使用 -fpie/-fPIE 加 –pie 生成地址無關可執行文件,否則無法被
    的頭像 發表于 06-22 08:31 ?3959次閱讀
    一文了解<b class='flag-5'>Prelink</b>的注意事項

    交叉編譯器安裝教程

    交叉編譯器中“交叉”的意思就是在一個架構上編譯另外一個架構的代碼,相當于兩種架構“交叉”起來了。Ubuntu 自帶的 gcc
    的頭像 發表于 09-29 09:12 ?3437次閱讀

    QT如何配置交叉編譯工具?

    交叉編譯工具安裝 (glibc版本需要和開發板上的版本相兼容)
    的頭像 發表于 10-28 09:31 ?3369次閱讀

    Go工程化-交叉編譯概述

    交叉編譯,也稱跨平臺編譯,就是在一個平臺上編譯源代碼,生成結果為另一個平臺上的可執行代碼。
    的頭像 發表于 05-22 17:15 ?654次閱讀

    Linux交叉編譯選項與源碼與目標文件分離

    交叉編譯選項 編譯Linux,通常只需要運行 make menuconfig 配置要編譯的模塊,然后運行 make 。Linux默認是做本地編譯
    的頭像 發表于 09-27 11:48 ?792次閱讀

    QT開發學習筆記1(安裝交叉編譯器)

    QT安裝交叉編譯
    的頭像 發表于 02-18 10:02 ?859次閱讀
    QT開發學習筆記1(安裝<b class='flag-5'>交叉</b><b class='flag-5'>編譯</b>器)