net-snmp静态编译链接的获取程序及生成执行程序详解

 更新时间:2023年08月02日 09:33:03   作者:龚正阳  
这篇文章主要介绍了net-snmp静态编译链接的获取程序及生成执行程序详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

由于在某些场景需要使用静态链接的snmpwalk或者其他程序,为了方便执行文件的分发,适配多版本系统,所以需要自己编译net-snmp

实验操作系统Ubuntu22 amd64

获取程序

git clone方式

$ git clone https://github.com/net-snmp/net-snmp.git

或者也可以依据tag下载源码包

生成Makefile

net-snmp项目根路径下面有一个configure文件,可以用于生成Makefile,命令执行过程中会弹出一些输入确认,直接回车确认即可

$ ./configure --prefix=/tmp/snmp --disable-embedded-perl --without-perl-modules --disable-ucd-snmp-compatibility --disable-scripts

--prefix参数指定文件安装目录到/tmp/snmp

需要禁用perl相关模块以及一些脚本,否则可能会遇到错误如下

relocation R_X86_64_PC32 against symbol `netsnmp_ds_handle_config' can not be used when making a shared object; recompile with -fPIC

生成执行程序

如果此时项目根目录下面生成一个Makefile,则表示configure命令成功

执行程序的源码和生成的二进制都在apps/目录下

$ make LDFLAGS="-static"

校验生成的二进制执行文件,发现不是静态链接的

$ ldd apps/snmpwalk
        linux-vdso.so.1 (0x00007ffed71c1000)
        libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x00007ff639800000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff639400000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff639d7e000)

静态编译snmpwalk

发现在make snmpwalk执行的时候会产生两条执行命令,第一条是 gcc包含-static参数,但是第二条没包含

$ cd apps
$ rm snmpwalk
$ make snmpwalk
/bin/bash ../libtool  --mode=link gcc  -static -g -O2 -DNETSNMP_ENABLE_IPV6 -fno-strict-aliasing -DNETSNMP_REMOVE_U64 -g -O2 -Ulinux -Dlinux=linux  -Wall -Wextra -Wstrict-prototypes -Wwrite-strings -Wcast-qual -Wimplicit-fallthrough -Wlogical-op -Wundef -Wno-format-truncation -Wno-missing-field-initializers -Wno-sign-compare -Wno-unused-parameter  -o snmpwalk snmpwalk.lo ../snmplib/libnetsnmp.la   
libtool: link: gcc -g -O2 -DNETSNMP_ENABLE_IPV6 -fno-strict-aliasing -DNETSNMP_REMOVE_U64 -g -O2 -Ulinux -Dlinux=linux -Wall -Wextra -Wstrict-prototypes -Wwrite-strings -Wcast-qual -Wimplicit-fallthrough -Wlogical-op -Wundef -Wno-format-truncation -Wno-missing-field-initializers -Wno-sign-compare -Wno-unused-parameter -o snmpwalk .libs/snmpwalk.o  ../snmplib/.libs/libnetsnmp.a -lm -lssl -lcrypto

所以需要执行命令如下,把make snmpwalk的输出的第二条命令粘贴下来,手动在gcc后面加上-static参数

$ rm snmpwalk
$ gcc -static -g -O2 -DNETSNMP_ENABLE_IPV6 -fno-strict-aliasing -DNETSNMP_REMOVE_U64 -g -O2 -Ulinux -Dlinux=linux -Wall -Wextra -Wstrict-prototypes -Wwrite-strings -Wcast-qual -Wimplicit-fallthrough -Wlogical-op -Wundef -Wno-format-truncation -Wno-missing-field-initializers -Wno-sign-compare -Wno-unused-parameter -o snmpwalk .libs/snmpwalk.o  ../snmplib/.libs/libnetsnmp.a -lm -lssl -lcrypto 
# 执行的时候会产生告警信息如下,这是正常的
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libcrypto.a(libcrypto-lib-dso_dlfcn.o): in function `dlfcn_globallookup':
(.text+0x17): 警告: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/bin/ld: ../snmplib/.libs/libnetsnmp.a(system.o): in function `netsnmp_str_to_gid':
/home/gong/rust-work/github/net-snmp/snmplib/system.c:1492: 警告: Using 'getgrnam' in statically linked applications requires at runtime the shared libraries from the bc version used for linking
/usr/bin/ld: /home/gong/rust-work/github/net-snmp/snmplib/system.c:1494: 警告: Using 'endgrent' in statically linked applications requires at runtime the shared librar from the glibc version used for linking
/usr/bin/ld: ../snmplib/.libs/libnetsnmp.a(system.o): in function `netsnmp_str_to_uid':
/home/gong/rust-work/github/net-snmp/snmplib/system.c:1459: 警告: Using 'getpwnam' in statically linked applications requires at runtime the shared libraries from the bc version used for linking
/usr/bin/ld: /home/gong/rust-work/github/net-snmp/snmplib/system.c:1461: 警告: Using 'endpwent' in statically linked applications requires at runtime the shared librar from the glibc version used for linking
/usr/bin/ld: ../snmplib/.libs/libnetsnmp.a(system.o): in function `netsnmp_getaddrinfo':
/home/gong/rust-work/github/net-snmp/snmplib/system.c:884: 警告: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/bin/ld: ../snmplib/.libs/libnetsnmp.a(system.o): in function `netsnmp_gethostbyaddr':
/home/gong/rust-work/github/net-snmp/snmplib/system.c:1050: 警告: Using 'gethostbyaddr' in statically linked applications requires at runtime the shared libraries frome glibc version used for linking
/usr/bin/ld: ../snmplib/.libs/libnetsnmp.a(system.o): in function `netsnmp_gethostbyname':
/home/gong/rust-work/github/net-snmp/snmplib/system.c:980: 警告: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from  glibc version used for linking

检查snmpwalk链接

$ ldd snmpwalk

 不是动态可执行文件

之后也可以把生成的snmpwalk复制到另外一台古老的linux上运行校验,如果机器上有docker, 可以执行命令docker run -it alpine sh,把snmpwalk复制到容器内部执行

以上就是net-snmp静态编译链接的获取程序及生成执行程序详解的详细内容,更多关于net-snmp静态编译链接的资料请关注脚本之家其它相关文章!

相关文章

  • 详解git的基本使用方法

    详解git的基本使用方法

    这篇文章主要介绍了详解git的基本使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 软件测试实现Finddler的手机抓包过程

    软件测试实现Finddler的手机抓包过程

    本文主要简单的描述了Finddler的手机抓包过程,使用图文模式详细的描述了操作过程,非常的通俗易懂,可以快速上手跟着本章的描述就可以轻松实现
    2021-08-08
  • git clone下来的代码如何放在指定路径

    git clone下来的代码如何放在指定路径

    这篇文章主要介绍了git clone下来的代码如何放在指定路径,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 算法系列15天速成——第十三天 树操作【下】

    算法系列15天速成——第十三天 树操作【下】

    今天说下最后一种树,大家可否知道,文件压缩程序里面的核心结构,核心算法是什么?或许你知道,他就运用了赫夫曼树
    2013-11-11
  • 计算机中的字符串编码、乱码、BOM等问题详解

    计算机中的字符串编码、乱码、BOM等问题详解

    这篇文章主要介绍了计算机中的字符串编码、乱码、BOM等问题详解,对文件编码、vim乱码、什么情况下会出现乱码、字符编码的发展历史、字符集和编码的区别、汉字ANSI编码的发展历史、BOM头等问题做了全面总结、详细介绍,需要的朋友可以参考下
    2014-07-07
  • 文章中优酷视频全屏及去除广告在线转换

    文章中优酷视频全屏及去除广告在线转换

    很多网站发表了引用优酷视频不能全屏,或一点全屏又跳到官方网了,结果又要重新缓冲。用户体验特别不好。
    2010-09-09
  • Git多人协同开发紧急修复线上bug操作指南

    Git多人协同开发紧急修复线上bug操作指南

    这篇文章主要为大家介绍了Git多人协同开发紧急修复线上bug操作指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • kill一条TCP连接实现方法详解

    kill一条TCP连接实现方法详解

    这篇文章主要为大家介绍了kill一条TCP连接实现方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 几款开源的中文分词系统

    几款开源的中文分词系统

    中文分词是做好中文内容检索、文本分析的基础,主要应用于搜索引擎与数据挖掘领域。中文是以词为基本语素单位,而词与词之间并不像英语一样有空格来分隔,因而中文分词的难点在于如何准确而又快速地进行分词
    2012-11-11
  • VSCode自定义配色方案的实现

    VSCode自定义配色方案的实现

    这篇文章主要介绍了VSCode自定义配色方案的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论