Iperf: 配置不会生成静态链接的可执行文件

创建于 2017-08-14  ·  12评论  ·  资料来源: esnet/iperf

语境

  • iperf3 版本:
    3.2

  • 硬件:
    x86_64

  • 操作系统(和发行版,如果有的话):
    Ubuntu下ARM的交叉编译

错误报告

  • 预期行为
    构建静态链接的可执行文件

  • 实际行为
    使用动态链接库构建可执行文件

doru@doru-N551JK :~/Desktop/iperf$ 文件输出/bin/iperf3
output/bin/iperf3:ELF 32 位 LSB 可执行文件,ARM,EABI5 版本 1 (SYSV),动态链接(使用共享库),用于 GNU/Linux 2.6.32,BuildID[sha1]=6d84258ed9cbe40710234da5f5b1cf83644d not stripe

  • 重现步骤
    克隆主分支

应用此补丁: https :

配置

./configure --without-openssl --host=arm-none-linux-gnueabi CC=arm-linux-gnueabi-gcc LD=arm-linux-gnueabi-ld CXX=arm-linux-gnueabi-g++ CFLAGS=-static CXXFLAGS=-static --enable-static --disable-shared --prefix=/home/doru/Desktop/iperf3/output

  • 可能的解决方案

如果我使用上述步骤构建 iperf2(不是 iperf3),它会产生一个静态链接的可执行文件:
doru@doru-N551JK :~/Desktop/iperf-2.0.5/output/bin$ 文件 iperf
iperf:ELF 32 位 LSB 可执行文件,ARM,EABI5 版本 1 (SYSV),静态链接,用于 GNU/Linux 2.6.32,BuildID[sha1]=631918d87fb90840809bb5e5aa5b3d613bf1a775,未剥离

必须修改配置。

最有用的评论

也许更好的解决方法是在运行configure时设置LDFLAGS=--static configure注意额外的减号
例如:

configure "LDFLAGS=--static" --disable-shared 

这会构建一个静态可执行文件,但是会产生以下警告:

warning: Using 'getaddrinfo' in statically linked applications requires at runtime the 
shared libraries from the glibc version used for linking

所有12条评论

我确认这是一个问题(在 CentOS 7 和 FreeBSD 11 上测试,都是本机编译并且不需要交叉构建到另一个平台),但我还不知道为什么。 我们不经常测试此配置功能,但我_想_我曾见过它在过去的某个时间点工作。 我注意到出于某种原因,我们从未在configure.ac执行LT_INIT ,但我不清楚这是否是一个因素。

请注意,iperf2 和 iperf3 是完全独立的程序,具有不同的构建基础结构。

另外,我猜这确实与 libtool 有关,这不是我的专长,因此如果有人拥有 libtool 技能,将不胜感激。

好的。 我在一些 CentOS 7 虚拟机上重新审视了这一点。 我重新了解到--enable-static --disable-shared只是意味着不会构建共享库(在这种情况下libiperf.so )。 CFLAGS=-static尝试进行静态链接,但它要求安装libc-static RPM 中的静态 C 库。 此外,SCTP 支持可能会破坏此平台上的构建,因为据我所知,CentOS 7 中没有包含静态库(仅限动态库)的lksctp-*软件包。

所有这些都意味着我在实际构建静态链接的 iperf3 可执行文件时也遇到了麻烦,但这不是由于 iperf3 中的任何内容。

这确实是 libtool 的一个问题,现在已经讨论了 5 年多了。 请参阅关键:libtool 使静态链接成为不可能

我不知道在iperf修复它的最佳方法是什么。 目前我只能建议一个解决方法。

在运行configure后静态构建iperf3 configure替换
src/Makefile 155-157 行的

iperf3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(iperf3_CFLAGS) $(CFLAGS) \
        $(iperf3_LDFLAGS) $(LDFLAGS) -o $@

iperf3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) -all-static $(iperf3_CFLAGS) $(CFLAGS) \
        $(iperf3_LDFLAGS) $(LDFLAGS) -o $@

即在$(CCLD)之后直接插入-all-static $(CCLD)

问题在于 libtool 将提供给编译器的-static选项视为它自己的 MODE-ARG 并将其从编译器命令行中删除。

也许更好的解决方法是在运行configure时设置LDFLAGS=--static configure注意额外的减号
例如:

configure "LDFLAGS=--static" --disable-shared 

这会构建一个静态可执行文件,但是会产生以下警告:

warning: Using 'getaddrinfo' in statically linked applications requires at runtime the 
shared libraries from the glibc version used for linking

@d1mach :感谢您提供的信息和解决方法……这很有趣!

该解决方法对我在 CentOS 7 (x86_64) 上进行本地编译很有效。 我必须有一台安装了glibc-static机器,但没有安装任何lksctp-*东西。 此外,我没有使用 OpenSSL 构建(我使用的测试 VM 没有openssl-devel )。

我不确定这将如何在交叉编译环境中工作... @doru91您认为这种解决方法可能对您有帮助吗?

我的解决方案很好。

非常感谢!

我可能需要为 FAQ 写这个……我敢打赌,你不是唯一想要/需要构建静态可执行文件的人。 乐观地保持这个问题开放以提醒我这样做。

在 835ec5f 中添加了 FAQ 条目,关闭。 谢谢大家的信息和讨论!

@d1mach非常感谢你。 我有一个大问题。 你的回答对我很有效。

@d1mach这是来自未来的感谢。 那个“--static”技巧是我在互联网上搜索修复的技巧,但并没有完全理解出了什么问题。 这解决了它,将来会派上用场。 非常感激。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

arainero picture arainero  ·  3评论

Surendraknatarajan picture Surendraknatarajan  ·  9评论

bbordereau picture bbordereau  ·  10评论

danielaCasasv picture danielaCasasv  ·  4评论

fefone picture fefone  ·  5评论