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

內(nèi)網(wǎng)漫游過程中的編譯方法研究*

2021-08-06 09:18:48蔣立兵韓隆隆
通信技術(shù) 2021年7期
關(guān)鍵詞:嵌入式程序系統(tǒng)

蔣立兵,申 秋,韓隆隆

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

0 引 言

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

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

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

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

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

1 交叉編譯

1.1 概 念

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

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

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

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

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

1.2 交叉編譯工具鏈

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

1.3 交叉編譯工具鏈獲取

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

1.3.1 crosstool-NG獲取

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

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

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

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

然后按照常規(guī)的Linux編譯方法,可以編譯得到可執(zhí)行文件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內(nèi)部集成了很多默認配置,執(zhí)行ct-ng list-samples命令,可以查看支持的默認配置。如果配置剛好符合需求,可以直接使用,否則需要進行定制化修改。默認部分配置如下:

選擇和配置參數(shù)需要根據(jù)目標CPU架構(gòu)、系統(tǒng)、libc等信息進行判斷。

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

系統(tǒng)信息可通過uname-a指令查看。根據(jù)目標系統(tǒng)的系統(tǒng)版本信息,選擇相近的內(nèi)核版本。系統(tǒng)信息如下:

$ 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時需要選用與目標系統(tǒng)uClibc版本相同的版本,圖2中的uClibc版本為0.9.33.2。

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

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

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

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

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

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

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

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

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

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

1.3.3 交叉編譯工具鏈使用

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

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

2 低版本系統(tǒng)兼容運行高版本程序

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

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

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

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

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

root@m(xù)yuser: 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文件夾。首先執(zhí)行patchelf --set-rpath ./mylib dropbear,同時需要修改指定與libc配套的ld.so文件,執(zhí)行patchelf --set-interpreter ./mylib/ld-2.15.so。執(zhí)行成功后,其次通過ldd指令查看動態(tài)庫鏈接情況,程序所需的庫已指向當前目錄下的mylib文件夾,如下:

root@m(xù)yuser: 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文件有最低內(nèi)核版本的限制,目標平臺的內(nèi)核版本過低的話,也會導致運行不成功。

3 結(jié) 語

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

猜你喜歡
嵌入式程序系統(tǒng)
Smartflower POP 一體式光伏系統(tǒng)
WJ-700無人機系統(tǒng)
ZC系列無人機遙感系統(tǒng)
北京測繪(2020年12期)2020-12-29 01:33:58
試論我國未決羈押程序的立法完善
搭建基于Qt的嵌入式開發(fā)平臺
“程序猿”的生活什么樣
連通與提升系統(tǒng)的最后一塊拼圖 Audiolab 傲立 M-DAC mini
英國與歐盟正式啟動“離婚”程序程序
嵌入式軟PLC在電鍍生產(chǎn)流程控制系統(tǒng)中的應用
創(chuàng)衛(wèi)暗訪程序有待改進
主站蜘蛛池模板: 亚洲AV一二三区无码AV蜜桃| 91福利免费视频| 成人精品在线观看| 欧美区在线播放| 第九色区aⅴ天堂久久香| av一区二区人妻无码| 四虎永久免费地址| 亚洲—日韩aV在线| 色窝窝免费一区二区三区 | 亚洲AⅤ无码国产精品| 中国国产一级毛片| 午夜高清国产拍精品| 国产无套粉嫩白浆| 成·人免费午夜无码视频在线观看| 全部无卡免费的毛片在线看| 国产精品欧美亚洲韩国日本不卡| 国产精品无码AV中文| 毛片免费高清免费| 一级黄色欧美| 国产精品林美惠子在线观看| 精品福利视频网| 国产精品女在线观看| 又爽又黄又无遮挡网站| 美女被躁出白浆视频播放| 99精品伊人久久久大香线蕉| 88av在线| 国产亚洲高清在线精品99| 在线a网站| 日韩区欧美国产区在线观看| 久久99精品久久久久纯品| 日韩av无码精品专区| 日本在线视频免费| 国产H片无码不卡在线视频| 伊人久久久大香线蕉综合直播| 最新国产你懂的在线网址| 亚洲精品在线影院| 久久青草视频| av在线无码浏览| 久久久精品无码一区二区三区| 在线欧美国产| 波多野结衣中文字幕一区二区| 国产精品高清国产三级囯产AV| 欧美日韩亚洲综合在线观看| 国产第一页免费浮力影院| 国产欧美日韩视频怡春院| 无码日韩精品91超碰| 国产在线观看91精品亚瑟| 五月婷婷丁香色| 国产精品尹人在线观看| 国产成人高清精品免费软件| 亚洲va精品中文字幕| 国产成人1024精品| 久久精品丝袜高跟鞋| 999精品色在线观看| 国产高清不卡视频| 精品久久久无码专区中文字幕| 最新加勒比隔壁人妻| 精品无码一区二区三区电影| www.99在线观看| 国产9191精品免费观看| 综合久久五月天| 91视频日本| 欧美日本中文| 三级国产在线观看| 亚洲无线国产观看| 欧美精品亚洲精品日韩专| 亚洲人成影院午夜网站| 天天干伊人| 欧美伊人色综合久久天天| 成人福利在线看| 日韩精品久久久久久久电影蜜臀| 91久久天天躁狠狠躁夜夜| 欧美a在线看| 九九热精品视频在线| 亚洲综合久久成人AV| 国产一级特黄aa级特黄裸毛片| 成人午夜久久| 久精品色妇丰满人妻| 日韩欧美中文| 色国产视频| 日本不卡免费高清视频| 久久婷婷六月|