日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

arm 交叉编译找不到so_嵌入式杂谈之交叉编译

發布時間:2023/12/2 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 arm 交叉编译找不到so_嵌入式杂谈之交叉编译 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這次扯一下嵌入式開發過程中經常用到的交叉編譯器,雖說在之前的文章也提到過這個問題,不過上次是著重介紹為什么使用交叉編譯器(主要是為了勸服自己從單片機的思想中脫離出來,慢慢的接受嵌入式Linux開發的一些約定俗成的工具與方法),而這次的重點一方面是科普交叉編譯器的相關知識,另一方面著重介紹怎么使用交叉編譯器提供的各種工具完成相應的任務。 廢話少說,上干貨。

交叉編譯器選擇

首先認可一點,交叉編譯器是一個軟件工具,那既然是一個軟件,那就必須知道這個軟件是怎么來的,目前分為兩種情況。 芯片廠商提供的或者開源的和自己制作的交叉編譯器 自己制作交叉編譯器比較麻煩,步驟單一,但版本依賴關系大,而且必須了解編譯原理,耗時費力

所以我們果斷使用芯片廠商提供的或者開源的交叉編譯工具鏈

交叉編譯器命名規則

arm-none-linux-gnueabi- 最最常用的一種, 第一個單詞表示編譯得的什么目標架構的 第二個單詞是廠商名,可以是三星或者恩智浦等,但開源的一般都為none 第三個單詞表示程序編譯出來的程序默認應用的系統,因為編譯器的標準C庫等是與Linux兼容的 第四個單詞gnu表示gnu項目 第四個單詞eabi指的是嵌入式接口 可以簡寫為以下形式 arm-linux- arm-none-eabi- 表示編譯出來的程序不支持操作系統

交叉編譯器源碼目錄介紹

交叉編譯器包含的目錄如上圖所示

  • bin目錄相當于交叉編譯的命令集合,包含了數十種工具
  • lib相當于交叉編譯器運行的時候需要的庫以及目標程序所需要的庫。 在這里我們需要知道,交叉編譯器本身是一個程序軟件,所以交叉編譯器的運行工作需要依賴庫文件,另一方面交纏編譯器需要將源文件進行編譯,而編譯得到的另一種架構上的代碼運行也需要庫文件。 這就說明,交叉編譯器需要兩種庫,一種是它本身需要的,另一種是編譯出來的程序需要的

添加交叉編譯器命令到環境變量

為了讓交叉編譯器的命令不用制定目錄運行,所以需要添加環境變量 (如果有不明白什么是環境變量的,還是最好百度一下)

  • 方案一: echo $PATH查看當前系統環境變量 echo xxx >> PATH追加路徑到環境變量,只針對當前shell起作用
  • 方案二:
    編輯/etc/environment文件添加環境變量,可以永久保存,但是修改完這個文件以后需要使用source /etc/environment命令將環境變量進行更新

交叉編譯器中嵌入式工具集合

  • readelf
    我們通常理解的程序軟件都是運行在操作系統之上的,但是有的程序不能在不同的操作系統之上運行。
    這是因為:
    我們最終編譯出來的可執行程序分兩部分:真正的程序文件以及頭信息 不同操作系統的頭的格式是不同的,Windows上稱為PE頭,Linux上稱為ELF頭。
    這個頭部信息是專門給操作系統識別的。
    開發裸機的時候需要使用objcopy這個命令將頭部信息取出來,留下真正的程序文件。
    因為帶有頭文件的程序剛開始不是可執行代碼,裸機狀態下無法執行,會導致程序一開始就卡死。
    所以我們在裸機開發的時候在得到二進制文件以后再處理一下就是可以理解的了(說實話,這一點我當時非常疑惑)readelf是讀取可執行程序的頭部信息objcopy是抽取頭部信息然后丟棄掉
    使用方法: read -h 可執行程序名
  • 入口地址表示程序的運行地址,所以一些病毒程序可能就是修改了這個入口地址,相當于我們雙擊一個原來的程序的時候,直接跳轉到了病毒程序。
    綜上所述,在可執行文件的頭部有一個頭信息可以被操作系統識別,進行解析 。
    在Linux上使用file命令可以查看可執行文件的相關信息,比如運行平臺架構 。

    2. size
    讀取可執行程序的大小 包含代碼段,數據段,bss段等等

    當改變全局變量或者其他的時候,可以看到代碼信息的改變 關于程序的各種段也是一塊比較大的知識點,有機會補一篇文章(狗頭)
    3.nm
    符號列表的概念,最精簡,最好用的工具。
    可以查看可執行程序的符號表,比如程序中的全局標簽

    T表示全局函數 D表示全局變量區 d表示 static 修飾的變量 t表示被 static 修飾的函數
    4.strip
    剔除符號表。
    相當于將剛才說的符號表進行剔除。
    因為程序運行的時候不需要符號表 使用file命令可以查看是否剔除符號表

    剔除符號表以后文件大小會變得更小一點

    一般情況下,生產過程最后將最后的程序進行剔除符號表 只能自己架構的工具剔除自己架構的程序的符號表
    5.strings
    查看可執行程序的常量字符串


    6.objcopy
    表示將頭部信息拷出來,不然無法識別相應程序
    7.objdump
    反匯編程序 objdump -d <name> 或者 -D表示反匯編文件
    8.addr2line
    調試過程中將出錯的結果及行號標志出來 但一般用不到

    了解更多技術文章,歡迎關注我的個人公眾號

    總結

    以上是生活随笔為你收集整理的arm 交叉编译找不到so_嵌入式杂谈之交叉编译的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。