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