<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      二. LLVM交叉編譯

       

      前言:交叉編譯最重要的是生成具有與編譯機不同架構的指令,除此之外,編譯過程還需要完整的工具鏈,包括編譯器、鏈接器、庫、頭文件等。

      ??GCC會針對每個編譯主機和目標架構提供一套完整的套件,包含了二進制、頭文件和庫等。所以一般使用起來比較簡單,下載對應的安裝包,解壓到一個合適的目錄就可以使用了,編譯器會使用自帶的頭文件和庫。

      ??不過 LLVM 有所不同,LLVM 是復用一套編譯系統負責多個目標架構的編譯任務,通過 -target 選項來區分。這樣的好處是開發者可以維護一套編譯環境即可編譯多個平臺和架構的程序。但是這樣會給開發者帶來使用上的麻煩,因為要不同的目標架構和系統的程序會需要鏈接不同的庫,而編譯器需要足夠的參數被告知去哪里尋找這些庫和頭文件的位置。不僅如此,這些編譯所需的庫通常也需要開發者自己去準備。


      1. 準備工作

      ??如果希望進行交叉編譯,就需要我們的編譯器支持目標架構,即擁有對應的控制臺。LLVM支持哪些目標架構是在其編譯的時候決定的,而前一章在編譯LLVM的時候我們,并沒有指定相關的參數,即 LLVM_TARGETS_TO_BUILD。不過該參數有一個默認值 LLVM_ALL_TARGETS,即所有支持的架構,所以我們編譯的 LLVM 說明已經是支持很多架構的了。

      如果想知道我們的LLVM支持哪些架構,可以通過llc -version命令查看

      注:ARM是32位的arm架構,AARCH64和ARMV64是64位的arm架構,thumb是16位的arm架構,X86包含了32位和64位,而arm架構系列又分了大端和小端,于是出現了這么多的組合。

      查看Target目錄

      cd llvm/lib/Target/
      ls #查看文件目錄

      從目錄結構可以看出,這么多目標架構,實際上總共就這幾個實現,即ARM列的大端和小端,X86系列的32位和64位,實際上是同一套代碼實現的。

      ls ARM/進入ARM文件夾查看

      可以看出,thumb架構實際上是合用了ARM 32-bit的實現。如果參數LLVM_TARGETS_TO_BUILD只設置ARM,編譯結果支持了ARM和Thumb的大端和小端,即arm 32-bit和16-bit系列共四種架構。

      接下來我們測試一下是否可以在X86環境下編譯出arm64的程序。

      2. 交叉編譯 X86→ARM64

      編寫一個C程序

      #include <stdio.h>
      
      int main()
      {
          int a = 1;
          int b = 2;
          printf("%d + %d = %d\n", a, b, a + b);
          return 0;
      }

      使用 Clang 進行交叉編譯需要用 -target 參數來指定編譯目標,這里我們使用 aarch64-linux-gnu,即所謂的三段式目標表示形式。

      clang -target aarch64-linux-gnu cctest.c -o cctest

      報錯

      錯誤是因為編譯器找不到某些頭文件。我們前面文已經提到過,交叉編譯環境需要目標架構所需的相關庫和頭文件。這部分應該由硬件廠商提供,我們需要自行獲取。那么我們需要獲取哪些庫呢?無非是C/C++標準庫和鏈接器,我們嘗試通過apt的搜索命令apt search arm64來查詢。

      根據當前環境的GCC版本,

      需要安裝以下庫

      sudo apt install binutils-aarch64-linux-gnu 
      sudo apt install cpp-5-aarch64-linux-gnu 
      sudo apt install g++-5-aarch64-linux-gnu 
      sudo apt install linux-libc-dev-arm64-cross 
      sudo apt install libstdc++-5-dev-arm64-cross 
      sudo apt install libstdc++6-5-dbg-arm64-cross 
      sudo apt install libstdc++6-arm64-cross 
      sudo apt install libgcc-5-dev-arm64-cross 
      sudo apt install crossbuild-essential-arm64

      繼續

      clang -target aarch64-linux-gnu --sysroot=/usr/aarch64-linux-gnu cctest.c -o cctest
      # Clang通過--sysroot=/pat來獲取安裝的庫的位置

      報錯鏈接器找不到某個.o文件

      通過llvm開發的鏈接器 lld 解決這個問題,首先下載lld,解壓到/llvm/tools,接下來重新編譯llvm,注意此時需要將編譯目錄清空,否則不會把新加的代碼引入編譯

      重新編譯之后再回來。這次我們需要用lld需要使用參數 -fuse-ld=lld 來指定

       

      clang -target aarch64-linux-gnu --sysroot=/usr/aarch64-linux-gnu -fuse-ld=lld cctest.c -o cctest

      用了 lld 似乎完全沒有變化,問題還在。不過我們可以看到,這里說找不到的文件,crtbegin.o 在 /usr/aarch64-linux-gnu 中確實不存在。而相關的庫該裝的都已經裝好了,到底這個文件有沒有?在哪里呢?那我們來搜索看看。

      有兩個目錄存在,第一個是 x86 的,另一個才是我們需要的。這個目錄并不在 /usr/aarch64-linux-gnu 里面,或許需要我們手動指定來告訴 lld

      clang -target aarch64-linux-gnu --sysroot=/usr/aarch64-linux-gnu -L/usr/lib/gcc-cross/aarch64-linux-gnu/5 -fuse-ld=lld cctest.c -o cctest

      這次問題變少了,雖然 crtbegin.o 文件依然找不到,但后面的一些報錯是沒有了。為了搞清楚問題,我們給編譯命令加上更多的輸出來看看。我們可以通過添加 -v 參數來獲得更詳細的輸出。

      我們看最后,從這個參數可以看出,似乎是要求把當前目錄的 crtbegin.o 和 crtend.o 拿來靜態鏈接,而非像一般的系統庫一樣動態鏈接。也就是說這兩個文件在一般系統上是不會提供動態鏈接庫的版本,或許是因為功能的特殊性(在進程啟動之初,動態鏈接庫加載之前使用),要求它們只能靜態鏈接到可執行文件中。

      在 llvm 的源碼中搜索這兩個文件,并把這兩個文件拷貝到當前目錄,再編譯試試。

      通過 file cctestreadelf cctest 來查看生成的可執行文件的信息,看起來沒有什么問題。接下來就需要來實際檢驗可執行文件在 arm64 的物理機上的運行效果了。

      3. 交叉編譯 X86→ARM32

      clang -target arm-linux-gnueabihf cctest.c -o cctest

      報錯:

      與ARM64相似,也是缺少依賴,通過

      apt search armhf

      查詢所需依賴:

      根據GCC版本安裝以下庫

      sudo apt install binutils-arm-linux-gnueabihf 
      sudo apt install cpp-5-arm-linux-gnueabihf
      sudo apt install g++-5-arm-linux-gnueabihf
      sudo apt install linux-libc-dev-armhf-cross 
      sudo apt install libstdc++-5-dev-armhf-cross
      sudo apt install libstdc++6-5-dbg-armhf-cross
      sudo apt install libstdc++6-armhf-cross
      sudo apt install libgcc-5-dev-armhf-cross
      sudo apt install crossbuild-essential-armhf

       同樣查詢crtbegin.o和crtend.o文件

      拷貝至當前目錄,再運行

      clang -target arm-linux-gnueabihf --sysroot=/usr/arm-linux-gnueabihf -L/usr/lib/gcc-cross/arm-linux-gnueabihf/5 -fuse-ld=lld cctest.c -o cctest32

      生成可執行程序

       


      參考:play_with_llvm/ch03.md at master · tuoxie007/play_with_llvm · GitHub

      posted @ 2023-07-12 11:18  種玫瑰的小劉  閱讀(3917)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 人妻少妇精品视频专区| 国产MD视频一区二区三区| 猫咪www免费人成网站| 久久99日本免费国产精品| 久久精品一本到99热免费| 无码中文字幕日韩专区| 亚洲欧美中文字幕日韩一区二区 | 国产国语一级毛片| 国内极度色诱视频网站| 麻豆av一区二区三区| 加勒比无码人妻东京热| 免费无码又黄又爽又刺激| 日韩精品亚洲精品第一页| 男人狂桶女人出白浆免费视频| 特黄aaaaaaa片免费视频| 99热精品国产三级在线观看| 51妺嘿嘿午夜福利| 国产成人亚洲老熟女精品| 亚洲情A成黄在线观看动漫尤物| 不卡一区二区国产精品| 暖暖影院日本高清...免费| 搡bbbb搡bbb搡| 日韩有码中文在线观看| 久久精品国产99国产精品| 亚洲av永久一区二区| 少妇xxxxx性开放| 一区二区三区鲁丝不卡| 免费国产精品黄色一区二区| 久久婷婷成人综合色综合| 国产无遮挡免费真人视频在线观看| 呈贡县| 亚洲人成色99999在线观看| 国产精品欧美一区二区三区不卡| 亚洲日本欧美日韩中文字幕 | 亚洲精品无码日韩国产不卡av| 国产综合久久99久久| 神马久久亚洲一区 二区| 91久久偷偷做嫩草影院免费看| 伊在人间香蕉最新视频| 巴塘县| 澳门永久av免费网站|