使用ptxdist交叉编译snort会导致INADDR_NONE配置错误

时间:2018-10-06 01:44:50

标签: linux cross-compiling autotools configure snort

我对使用ptxdist工具进行交叉编译非常陌生。我正在使用ptxdist版本2013.03.0并尝试使用Linux内核4.9.47为arm cortex构建snort 2.9.11.1。但是,当我运行ptxdist prepare snort命令时,它失败并显示以下错误:

checking for strlcat... no
checking for strerror... yes
checking for vswprintf... yes
checking for wprintf... yes
checking for snprintf... yes
checking size of char... 1
checking size of short... 2
checking size of int... 4
checking size of long int... 4
checking size of long long int... 8
checking size of unsigned int... 4
checking size of unsigned long int... 4
checking size of unsigned long long int... 8
checking for u_int8_t... yes
checking for u_int16_t... yes
checking for u_int32_t... yes
checking for u_int64_t... yes
checking for uint8_t... yes
checking for uint16_t... yes
checking for uint32_t... yes
checking for uint64_t... yes
checking for int8_t... yes
checking for int16_t... yes
checking for int32_t... yes
checking for int64_t... yes
checking for boolean... no
checking for INADDR_NONE... configure: error: in `/home/user/snort-2.9.11.1':
configure: error: cannot run test program while cross compiling
See `config.log' for more details.

我已经检查了configure.in文件。它尝试使用INADDR_NONE测试inet_addr()函数,但失败。以下是snort的configure.in文件的内容:

# In case INADDR_NONE is not defined (like on Solaris)
have_inaddr_none="no"
AC_MSG_CHECKING([for INADDR_NONE])
AC_RUN_IFELSE(
[AC_LANG_PROGRAM(
[[
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
]],
[[
    **if (inet_addr("10,5,2") == INADDR_NONE);**
    return 0;
]])],
[have_inaddr_none="yes"],
[have_inaddr_none="no"])
AC_MSG_RESULT($have_inaddr_none)
if test "x$have_inaddr_none" = "xno"; then
    AC_DEFINE([INADDR_NONE],[-1],[For INADDR_NONE definition])
fi

是交叉编译工具包或配置设置中缺少linux内核标头的情况吗?我在linux 4.9.47源代码中搜索INADDR_NONE的定义,并在

中找到了它
  

... linux.4.9.47 / include / uapi / linux / in.h

有人可以帮助我解决这个错误吗?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

问题不是不是目标上缺少INADDR_NONE(可能不是),而是配置测试使用了AC_RUN_IFELSE。顾名思义,并显示错误消息,AC_RUN_IFELSE尝试在目标上运行代码,该代码不适用于交叉编译。 Snort构建脚本中缺少此功能:它们尚未准备好进行交叉构建。

有几种解决方法:

  • 修复Snort。 AC_RUN_IFELSE应该是AC_COMPILE_IFELSE。毕竟,如果INADDR_NONE不可用,它将导致编译时失败,而不是运行时错误。但是,尽管此修复程序很简单(不要忘记在更改autoconf之后重新运行configure.in),但可能还有其他问题,因为很明显,该软件最近尚未交叉编译。

  • 避免交叉编译。这并不意味着您应该在实际目标上运行构建。您可以获得具有相同微架构的更强大的系统,或者可以尝试qemu-user emulation

  • 明确提供测试结果。。您可以覆盖使用AC_CACHE_CHECK的配置测试,并在调用./configure时明确提供结果。这似乎不适用于您遇到的测试失败,因为它不使用AC_CACHE_CHECK,但可能对其他方面有所帮助。传递预先计算的值的语法是在调用AC_CACHE_CHECK时,将./configure cache-id 参数中的变量设置为所需的值或作为./configure脚本的参数。