string.h:29:8: ошибка: ожидаемый идентификатор

Я пытаюсь скомпилировать nginx с помощью специального openssl "libressl", используя этот скрипт: https://gist.github.com/Belphemur/3c022598919e6a1788fc

Все отлично работает с использованием libressl 2.1.1. Проблема в том, что libressl 2.1.1 имеет некоторые проблемы с безопасностью, которые были решены в более новых выпусках.
Однако я не могу заставить сборку работать с libressl 2.1.2 или libressl 2.1.3 (последняя версия).

Вопрос, который я получаю:

..
cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g  -I src/core -I src/event -I src/event/modules -I src/os/unix -I /tmp/build/pcre-8.36 -I /tmp/build/libressl-2.1.2/.openssl/include -I objs \
        -o objs/src/core/nginx.o \
        src/core/nginx.c
In file included from /usr/include/string.h:635:0,
                 from /tmp/build/libressl-2.1.2/.openssl/include/string.h:6,
                 from src/os/unix/ngx_linux_config.h:27,
                 from src/core/ngx_config.h:26,
                 from src/core/nginx.c:8:
/tmp/build/libressl-2.1.2/.openssl/include/string.h:29:8: error: expected identifier or ‘(’ before ‘__extension__’
 char * strndup(const char *str, size_t maxlen);
        ^
make[1]: *** [objs/src/core/nginx.o] Error 1
make[1]: Leaving directory `/tmp/build/nginx-1.7.9'
make: *** [build] Error 2
All done.
..

В чем проблема и как ее решить?
Спасибо за помощь.

2 ответа

Решение

Я создатель сценария, который вы используете для сборки Nginx с помощью LibreSSL.

Теперь это исправлено, предыдущий способ сборки и использования libressl не работает с предыдущей версией скрипта. (Просто скопировав все включенные и удалив lib)

Сценарий теперь устанавливает libressl в заданную директорию и передает его nginx, таким образом, все включения, не требующиеся для использования библиотеки (например, string.h), не являются частью процесса сборки nginx.

strndup предоставляется в string.h, Вам не нужно предоставлять это здесь:

/tmp/build/libressl-2.1.2/.openssl/include/string.h:29:8: error: expected identifier or ‘(’ before ‘__extension__’
char * strndup(const char *str, size_t maxlen);

Я бы удалил копию string.h из источников, и используйте предоставленную платформу string.h за strndup,

На самом деле, я не знаю, где это string.h происходит из-за того, что его нет в моей системе (и я регулярно собираю и использую последнюю версию OpenSSL):

$ find /usr/local/ssl/ -name string.h
$ find /usr/local/ssl/ -name *.h
/usr/local/ssl/include/openssl/rc4.h
/usr/local/ssl/include/openssl/crypto.h
/usr/local/ssl/include/openssl/ts.h
/usr/local/ssl/include/openssl/ecdsa.h
/usr/local/ssl/include/openssl/opensslconf.h
...

Я пытаюсь скомпилировать nginx с помощью специального openssl "libressl", используя этот скрипт: https://gist.github.com/Belphemur/3c022598919e6a1788fc

ОК, это может быть проблемой, так как мне приходилось делать то же самое с nginx (FIPS проверял OpenSSL).

Самый простой способ справиться с этим - это собрать OpenSSL из исходников и установить его в /usr/local/ssl, Затем файлы grep nginx для -lcrypto а также -lssl, Когда вы найдете их, замените их статическим архивом OpenSSL:

  • менять -lcrypto в /usr/local/ssl/lib/libcrypto.a
  • менять -lssl в /usr/local/ssl/lib/libssl.a

И брось -L связанные с OpenSSL.

Это гарантирует, что вы используете вашу версию OpenSSL во время компиляции и во время выполнения без необходимости LD_PRELOAD а также DYLD_LIBRARY_PATH трюки. Это всегда будет работать.

Другие вопросы по тегам