1. 從官網下載指定版本的SNMP,此處選擇5.7.3,地址爲:https://sourceforge.net/projects/net-snmp/files/net-snmp/5.7.3/
2. 解壓:tar -zxvf net-snmp-5.7.3.tar.gz,解壓後生成一個net-snmp-5.7.3目錄;
3. 設置系統時間:date -s "2019-01-02 01:01:01",必須設置,否則編譯會出問題;
4. 安裝perl庫
由於SNMP需要依賴於perl庫,我查了當前系統的/usr/lib/目錄下,是沒有libperl.so的庫文件的,由於飛騰平臺不能直接從源上下載安裝,因此,只能選擇通過下載源碼來進行安裝。若不先安裝perl庫,在make過程中會因爲缺庫而無法繼續。
4.1 下載perl源碼:https://www.cpan.org/src/README.html, 此處選擇perl-5.28.1.tar.gz版本;
4.2 解壓:tar -zxvf perl-5.28.1.tar.gz;
4.3 生成編譯規則:./Configure -de -Dprefix=/usr/local -Dusethreads -Duseshrplib -Accflags=“-fPIC”
其中,-Duseshrplib選項是設置編譯生成libperl.so庫文件,-Accflags選項添加的-fPIC是避免動態庫和靜態庫之間互相調用可能導致相對/絕對路徑的問題。
4.4 make
4.5 make test
4.6 make install
安裝好以後,原系統中就已經安裝了perl庫,對應也就解決了snmp編譯過程中報卻-lperl庫的問題。
5. 生成編譯規則(問答選項回車默認即可):
問題一:報錯“configure: error: cannot guess build type; you must specify one”,剛開始該問題,我通過將--host,--build,--target全指定爲aarch64,但是報錯“Invalid configuration 'aarch64':machine 'aarch64' not recognized”,這是因爲在config.guess中並不包含對aarch64體系結構的支持,我嘗試在該文件對應分支中加上aarch64但沒成功,後來讀 config.guess的頭部 註釋說明,其中有這樣一句:
於是我從https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess網址上獲取最新的config.guess,並替換現有目錄下的該文件,發現最新版本文件中是包含對aarch64支持的。
同樣,config.sub文件也是如此,其頭部註釋如下圖示:
同理,從https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub下載最新文件進行替換。
至此,該問題算是解決了,此時通過./configure可以直接猜測到對應機器類型並執行編譯規則生成。
6. 開始編譯:make
問題一:提示:
/usr/bin/ld: /usr/local/lib/libnetsnmp.a(default_store.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against external symbol '__stack_chk_guard@@GLIBC_2.17' can not be used when making a shared object;recompile with -fPIC
/usr/bin/ld: /usr/local/lib/libnetsnmp.a(default_store.o):無法解決R_AARCH64_ADR_PREL_PG_HI21重定向於符號"__stack_chk_guard@@GLIBC_2.17"有衝突 /usr/bin/ld:最後的鏈接失敗:錯誤的值
該問題折騰了很久,反正是各種試,最後在snmp官網的bug系統中,在別人提的bug 中看到了別人的配置項,需要在編譯SNMP時加上--disable-shared選項才行。
所以,很多問題還是要從官網下手,其對應的bug系統地址爲:https://sourceforge.net/p/net-snmp/bugs/2701/
7. 安裝編譯:make install