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

Я новичок в кросс-компиляции с использованием инструмента 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

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

Любая помощь будет оценена по достоинству.


person awatan    schedule 06.10.2018    source источник


Ответы (1)


Проблема не в том, что в цели отсутствует 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. .

person Florian Weimer    schedule 06.10.2018
comment
Большое спасибо, Флориан. Первый способ не работает. Я попробую другие. - person awatan; 08.10.2018
comment
Я смог выполнить кросс-компиляцию и запустить snort. К сожалению, ни один из вышеупомянутых вариантов не работал для этой конкретной проблемы, но преобразование AC_RUN_IFELSE в AC_COMPILE_IFESLE помогло разобраться с проверкой функций daq во время выполнения скрипта configure. Для этой конкретной проблемы INADDR_NONE мне пришлось исправить файл configure.in, который полностью удалил проверку части INADDR_NONE. - person awatan; 16.10.2018