我对使用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
有人可以帮助我解决这个错误吗?
任何帮助将不胜感激。
答案 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
脚本的参数。