Кросс-компиляция snort с использованием ptxdist приводит к ошибке конфигурации INADDR_NONE - PullRequest
0 голосов
/ 06 октября 2018

Я очень новичок в кросс-компиляции с использованием инструмента ptxdist.Я использую ptxdist версии 2013.03.0 и пытаюсь собрать snort 2.9.11.1 для arm cortex с ядром linux 4.9.47.Однако, когда я запускаю команду 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.Он пытается протестировать функцию inet_addr () с INADDR_NONE, но не удается.Ниже приведено содержимое файла configure.in snort:

# 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 в инструментарии кросс-компиляции или в настройках конфигурации?Я искал определение INADDR_NONE в исходном коде linux 4.9.47 и нашел его в

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

Может кто-нибудь помочь мне обойти эту ошибку?

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 06 октября 2018

Проблема не в том, что INADDR_NONE отсутствует на цели (скорее всего, нет), а в том, что тест настройки использует AC_RUN_IFELSE.Как следует из названия и сообщения об ошибке, AC_RUN_IFELSE пытается выполнить код на цели, который не работает с кросс-компиляцией.Эта функция отсутствует в сценариях сборки Snort: они не готовы к перекрестному построению.

Существует несколько способов решения этой проблемы:

  • ИсправитьSnort. AC_RUN_IFELSE должно быть AC_COMPILE_IFELSE.В конце концов, если INADDR_NONE недоступен, это должно привести к сбою во время компиляции, а не к ошибке во время выполнения.Однако, хотя это исправление тривиально (не забудьте перезапустить autoconf после изменения configure.in), могут быть и другие проблемы, поскольку очевидно, что программное обеспечение не было кросс-компилировано в последнее время.

  • Избегайте кросс-компиляции. Это не означает, что вы должны запускать сборку на фактической цели.Вы можете получить более мощную систему с идентичной микроархитектурой или попробовать qemu-user эмуляцию .

  • Предоставить результаты теста явно. Вы можете переопределить конфигурационные тесты, которые используют AC_CACHE_CHECK и предоставить результаты явным образом при вызове ./configure.Это не работает для сломанного теста, с которым вы столкнулись, потому что он не использует AC_CACHE_CHECK, но может помочь с чем-то другим.Синтаксис для передачи предварительно вычисленного значения состоит в том, чтобы установить переменную в аргументе cache-id из AC_CACHE_CHECK в желаемое значение, когда вызывается ./configure, либо в аргументе, либо в качестве аргумента длясценарий ./configure.

...