1. 错误信息
如图,环境搭建参考iperf测试recovery模式下WiFi吞吐量,iperf运行后报错误CANNOT LINK EXECUTABLE: empty/missing DT_HASH in"iperf" (built with --hash-style=gnu?),如下图
错误信息 “CANNOT LINK EXECUTABLE: empty/missing DT_HASH in ‘iperf’ (built with --hash-style=gnu?)” 表示尝试执行的二进制文件(在这个例子中是 iperf)在动态链接时出现了问题。这个问题通常发生在以下几种情况下:
- 构建和运行环境不匹配: 如果二进制文件是在一个使用了不同的 --hash-style 选项的环境中构建的,然后在一个不兼容的环境中运行,就会出现这个问题。例如,如果二进制文件是用 --hash-style=gnu 编译的,但是运行环境期望的是 --hash-style=both 或者 --hash-style=sysv。
- 工具链不匹配: 使用不同的编译器或者链接器版本可能会引起这个问题,尤其是如果你在构建二进制文件时使用了一个版本的工具链,而在运行时使用了另一个版本的工具链。
- 二进制文件损坏: 二进制文件可能在传输或者存储过程中损坏,导致动态链接器无法正确解析它的符号表。
2. 尝试解决方案:
- 确保构建和运行环境一致: 确保你用来构建 iperf 的编译器和链接器与你用来运行 iperf 的环境中的编译器和链接器是相同的版本。
- 使用相同的 --hash-style 选项: 如果你控制着 iperf 的构建过程,确保使用与运行环境兼容的 --hash-style 选项。如果不确定使用什么选项,可以尝试将 --hash-style 设置为 both,这样会生成两种风格的哈希表。
- 重新构建 iperf: 如果你能够访问 iperf 的源代码,尝试在兼容的环境中重新构建它。
- 检查二进制文件: 使用 file 命令检查 iperf 二进制文件,看看它的构建属性。例如:
这应该会告诉你 iperf 是如何构建的,包括使用了什么 --hash-style 选项。file iperf
- 更新工具链: 如果你的工具链版本过旧,尝试更新到最新版本,以确保兼容性。
- 使用静态链接: 如果问题依然存在,可以考虑静态链接所有的依赖,这样可以避免动态链接带来的问题。
3. 最终原因:
此错误出现原因为,Android 4.4 与 Android 9.0 的iperf文件不同,使用9.0的iperf在Android 4.4上运行会报如下错误