999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

內網漫游過程中的編譯方法研究*

2021-08-06 09:18:48蔣立兵韓隆隆
通信技術 2021年7期
關鍵詞:嵌入式程序系統

蔣立兵,申 秋,韓隆隆

(中國電子科技集團公司第三十研究所,四川 成都 610041)

0 引 言

在某些特殊網絡內進行內網漫游的時候,能夠觸及甚至登錄大量的設備或板卡,這些板卡通常運行的是嵌入式Linux系統,能夠通過telnet或ssh方式登錄。當需要在這些設備上運行一些常用的工具時,會面臨一些比較棘手的問題,大致可分為如下幾類。

(1)目標CPU架構為ARM、PowerPC、MIPS等嵌入式平臺時,x86架構下編譯的程序不能在目標上運行,而代碼在目標平臺也不能進行編譯。

(2)目標機器采用uClibc時,通過常規ARM、MIPS等交叉編譯工具編譯出的程序,在目標機器上依舊不能運行。

(3)目標機器的內核版本很低,高版本內核下編譯的程序不能在目標程序上運行。

本文從交叉編譯工具生成、交叉編譯和跨版本運行等方面進行闡述,能夠解決大部分上述問題。

1 交叉編譯

1.1 概 念

交叉編譯是在嵌入式領域常用的一種編譯方式,通過選擇不同的交叉編譯工具鏈,能夠在當前平臺下,編譯出可運行于不同體系架構平臺的程序[1]。例如在x86平臺電腦上,使用Android Studio進行Android JNI開發時,會調用ARM的交叉編譯工具鏈進行編譯,編譯好的軟件能夠在Android手機上運行。

使用交叉編譯的主要原因如下:

(1)目標平臺一般為低功耗設計,性能較低,運行速度較慢;

(2)編譯過程需要消耗大量資源,嵌入式系統往往沒有足夠的內存和硬盤;

(3)完整的編譯環境需要很多支持包,很多嵌入式系統是精簡版Linux,難以滿足需求。

1.2 交叉編譯工具鏈

Linux編譯過程包括了預處理、編譯、匯編、鏈接等過程[2-3],如圖1所示。交叉編譯工具鏈(Toolchain)就是為了編譯跨平臺體系結構的程序代碼而形成的一套完整工具集。它隱藏了預處理、編譯、匯編、鏈接等細節。當指定了源文件(.c)和編譯工具(GCC)時,它會按照編譯流程調用不同的子工具,生成最終的可執行文件(ELF)。

1.3 交叉編譯工具鏈獲取

嵌入式目標平臺類型眾多,包括ARM、MIPS、MIPS64、MIPS64el、PowerPC、PowerPC64 等。常用平臺的交叉編譯工具可以通過網絡下載,如ARM、MIPS等。但是當目標平臺是使用的libc版本不匹配時或目標內核版本過低時,都可能導致編譯出的程序不能正常運行,因此需要能夠自行編譯所需要平臺交叉編譯工具鏈。目前構建交叉編譯工具鏈可通過crosstool-NG、Buildroot等工具進行制作。對比了crosstool-NG和Buildroot兩款工具,其中crosstool-NG能夠支持更老的內核和libc版本,對于內網漫游過程中遇到的目標機器適應性更強,作為使用首選。Buildroot與crosstool-NG的使用類似,可以根據實際情況靈活選擇。本文使用crosstool-NG作為示例。

1.3.1 crosstool-NG獲取

目前,crosstool-NG的最新版為1.24,本文示例選用1.10[4]版本,可以支持較老的內核和libc版本。

想要編譯老版本內核的工具鏈,編譯環境的選擇也很重要,應盡量選用低版本操作系統,同時有相應的更新源支持,本文示例選用的操作系統為Ubuntu 12.04。

crosstool-NG源碼下載后需要進行編譯,編譯時需要安裝一些Linux組件,可以提前執行:

sudo apt-get install libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk

然后按照常規的Linux編譯方法,可以編譯得到可執行文件ct-ng,如下所示。

root@ubuntu:~# ct-ng -v

GNU Make 3.81

Copyright (C) 2006 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.

There is NO warranty; not even for MERCHAN TABILITY or FITNESS FOR A

PARTICULAR PURPOSE.

1.3.2 crosstool-NG使用

crosstool-NG內部集成了很多默認配置,執行ct-ng list-samples命令,可以查看支持的默認配置。如果配置剛好符合需求,可以直接使用,否則需要進行定制化修改。默認部分配置如下:

選擇和配置參數需要根據目標CPU架構、系統、libc等信息進行判斷。

CPU架構可以通過cat /proc/cpuinfo指令查看,根據CPU型號,判斷CPU的架構類型,如ARM、MIPS64、MIPS64(el為小端模式)等,部分CPU信息如下:

系統信息可通過uname-a指令查看。根據目標系統的系統版本信息,選擇相近的內核版本。系統信息如下:

$ uname -a

Linux localhost 4.19.81-perf-gb5c27fd #1 SMP PREEMPT Thu Aug 6 04:10:30 CST 2020 aarch64 Android

目標平臺使用的是glibc還是uClibc,通過在目標平臺查看/lib目錄下的libc庫文件進行判斷,如果為libc.so.6,則使用glibc;如果為libuClibc-0.9.xx.xx.so,則使用uClibc。配置ct-ng時需要選用與目標系統uClibc版本相同的版本,圖2中的uClibc版本為0.9.33.2。

本文通過PowerPC平臺,展示參數配置過程。

(1)執行ct-ng powerpc-unknown-linux-gnu,配置成默認配置。

(2)執行ct-ng menuconfig進入配置界面,如圖3所示。

(3)進入Target options頁面,配置CPU參數,主要參數為Target Architecture(CPU架構)、Bitness(32位或64位)、Endianness(大小端),其他參數根據CPU單獨進行配置,如圖4所示。

(4)進入Option System頁面,配置系統參數,主要參數為Linux Kernel Version,如圖5所示。

(5)進入C Compiler頁面,配置編譯器選項,主要參數為gcc version,根據目標系統選擇合適的GCC版本,如果需要編譯C++代碼,需要勾選C++選項,如圖6所示。

(6)進入C library頁面,配置libc選項,主要參數為C library(選擇glibc或uClibc),*libc version(選擇glibc或uClibc的版本),如圖7所示。

配置完成后,可以執行ct-ng build,進行編譯。編譯過程中,需要下載很多源碼包,但是由于選擇的crosstool-NG版本太老,默認下載鏈接已經失效,需要手動下載。開始編譯后,會在當前目錄生成target文件夾,進入./target/tarballs/目錄下,查看有tmp-dl結尾的文件,下載相應的包,然后拷貝到tarballs目錄。大部分的包都可以在清華開源軟件鏡像站[5]進行下載。

完成所有的包下載后,開始進行編譯,編譯過程時間較長,編譯過程中也可能出現各種各樣的錯誤,一般是由于缺少庫,或者配置錯誤,或者是操作系統和GCC版本不匹配等問題,可以通過搜索具體問題進行解決。由于編譯過程的自由度頗高,可能出現的問題也較多,具體如何解決問題不在本文贅述。

編譯完成后會在/home/(user)/x-tools/目錄下生成相應的工具鏈,其中/bin目錄下包含了gcc、g++、as等交叉編譯工具,如圖8所示。

1.3.3 交叉編譯工具鏈使用

將生成的交叉編譯工具鏈所在的bin文件目錄加入系統環境變量,可以直接調用相應的編譯工具進行編譯,也可在使用Makefile時直接使用。如未加入環境變量,則需要指定絕對路徑,例如,/home/test/x-tools/powerpc-unknown-linux-gnu/bin/powerpc-unknown-linux-gnu-gcc。

編譯完成ELF文件可以通過file指令查看文件的基本信息,同時可以將工具上傳到目標機器上進行使用驗證,如果仍然不能正常運行,則需要檢查libc版本是否正確、Linux內核是否支持等問題,調整參數后重新編譯工具鏈。

2 低版本系統兼容運行高版本程序

在內網漫游過程中,還存在一種較為特殊的情況。目標系統是x86或x64平臺,但系統內核比較老,libc庫所支持的版本也比較老。在較高版本編譯環境下編譯出的ELF文件,在目標平臺運行是,可能出現如圖9所示類似的錯誤。

圖9中出錯的原因在于,源碼中使用了高版本libc包含的庫函數,而目標平臺的libc版本較低,不支持這些庫函數,從而導致沒有辦法正常運行。解決方案有兩種,一是修改程序源碼,找到使用高版本庫函數的地方,就行修改和替換;二是將高版本的libc庫文件上傳到目標,通過修改可執行文件的lib庫依賴路徑,使得能夠在目標平臺上正常運行。修改源碼的方式對較為簡單的代碼比較實用,但對于較為復雜的程序需要選用第二種方式,下面介紹如何實現。

首先需要安裝patchelf工具,Ubuntu可以通過apt-get install patchelf指令進行安裝。

patchelf 是一個用來修改ELF程序的小工具,可以修改動態鏈接庫的默認搜索路徑rpath。

在編譯平臺上,建立新文件夾mylib,然后使用ldd指令查看編譯好的程序所需的庫文件,然后將所有依賴的庫文件拷貝到mylib文件夾,如下:

root@myuser: ldd dropbear

linux-vdso.so.1 => (0x00007fffd25d2000)

libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1(0x00007fd429d6b000)

libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1(0x00007fd429b51000)

libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007fd429919000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6(0x00007fd42954f000)

./mylib/ld-2.15.so => /lib64/ld-linux-x86-64.so.2(0x00007fd42a1af000)

通過patchelf修改編譯好的ELF文件的rpath,可以將文件的默認鏈接庫文件地址指向mylib文件夾。首先執行patchelf --set-rpath ./mylib dropbear,同時需要修改指定與libc配套的ld.so文件,執行patchelf --set-interpreter ./mylib/ld-2.15.so。執行成功后,其次通過ldd指令查看動態庫鏈接情況,程序所需的庫已指向當前目錄下的mylib文件夾,如下:

root@myuser: ldd dropbear

linux-vdso.so.1 => (0x00007ffcd7bef000)

libutil.so.1 => ./mylib/libutil.so.1 (0x00007 ff046340000)

libz.so.1 => ./mylib/libz.so.1 (0x00007ff046129000)

libcrypt.so.1 => ./mylib/libcrypt.so.1 (0x00007 ff045ef0000)

libc.so.6 => ./mylib/libc.so.6 (0x00007 ff045b30000)

./mylib/ld-2.15.so => /lib64/ld-linux-x86-64.so.2(0x00007ff046784000)

將編譯好的ELF文件以及mylib文件夾上傳到目標平臺上,放在同一目錄下,即可成功運行。需要注意的是,ELF文件有最低內核版本的限制,目標平臺的內核版本過低的話,也會導致運行不成功。

3 結 語

本文針對在特殊網絡內進行內網漫游時,對多種平臺的板卡、終端設備空有權限而無法運行自己的常用工具的情況,提供了兩種解決方案:針對較老的內核和較為少用的CPU平臺,使用crosstool-NG工具,制作相應的交叉編譯工具鏈;針對內核版本過低的x86-64平臺,使用修改動態鏈接庫的方式,讓編譯好的ELF文件連接高版本的lib庫,從而能夠正常運行。

猜你喜歡
嵌入式程序系統
Smartflower POP 一體式光伏系統
工業設計(2022年8期)2022-09-09 07:43:20
WJ-700無人機系統
ZC系列無人機遙感系統
北京測繪(2020年12期)2020-12-29 01:33:58
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
搭建基于Qt的嵌入式開發平臺
“程序猿”的生活什么樣
連通與提升系統的最后一塊拼圖 Audiolab 傲立 M-DAC mini
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
嵌入式軟PLC在電鍍生產流程控制系統中的應用
電鍍與環保(2016年3期)2017-01-20 08:15:32
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
主站蜘蛛池模板: 免费一级大毛片a一观看不卡| 亚洲天堂精品视频| 亚洲无线一二三四区男男| 亚欧成人无码AV在线播放| 996免费视频国产在线播放| 亚洲日本www| 一级做a爰片久久免费| 亚洲色图欧美视频| 免费黄色国产视频| 国产精品吹潮在线观看中文 | 91色在线观看| 中文字幕丝袜一区二区| 亚洲中文无码av永久伊人| 亚洲AV成人一区二区三区AV| 久久99国产精品成人欧美| 精品一区二区无码av| 91精品国产麻豆国产自产在线| 伊人91在线| 国产一级无码不卡视频| 国产精品成人久久| 国产成在线观看免费视频| 欧美激情综合| 色成人亚洲| 亚洲色图在线观看| 国内精品一区二区在线观看| 国产精品久久久久久影院| 午夜无码一区二区三区| 成人午夜视频免费看欧美| 国产丝袜啪啪| 国产91丝袜在线播放动漫| 久久精品国产999大香线焦| 久久精品无码一区二区日韩免费| 午夜性爽视频男人的天堂| 久久精品无码中文字幕| 福利在线不卡| 国产91高跟丝袜| 亚洲国产午夜精华无码福利| 国语少妇高潮| 国产亚洲精品精品精品| 国产成人精品亚洲77美色| 国产门事件在线| AⅤ色综合久久天堂AV色综合| 91热爆在线| 色综合狠狠操| 欧美精品综合视频一区二区| 性做久久久久久久免费看| 91综合色区亚洲熟妇p| 久久青草免费91观看| 国产美女人喷水在线观看| 欧美一区二区人人喊爽| 伊在人亚洲香蕉精品播放 | 无码aaa视频| 67194在线午夜亚洲| 美女啪啪无遮挡| 毛片视频网址| 亚洲毛片网站| 无码有码中文字幕| 婷婷色一二三区波多野衣| 视频二区亚洲精品| 国产精品第一区| 99re热精品视频国产免费| 国产亚洲精品91| 亚洲视频无码| 99热这里只有精品国产99| 国内精品小视频在线| 青青国产在线| 亚洲日韩AV无码一区二区三区人| 日韩高清欧美| 任我操在线视频| 狠狠色香婷婷久久亚洲精品| 亚洲美女一级毛片| 亚洲中文字幕手机在线第一页| 精品国产网| 国产高清免费午夜在线视频| 久久夜色精品| 日本午夜视频在线观看| 伦伦影院精品一区| 日本午夜视频在线观看| 久久99国产乱子伦精品免| A级毛片高清免费视频就| 国产网友愉拍精品| 亚洲第一页在线观看|