Компиляция vsftpd 3.0.0 не удалась
Я недавно пытался скомпилировать vsftpd 3.0.0, но это не удалось из-за следующей ошибки компиляции:
gcc -c seccompsandbox.c -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wall -W - Wshadow -Werror -Wformat-security -D_FORTIFY_SOURCE=2 -idirafter dummyinc
seccompsandbox.c:63: error: ‘O_DIRECTORY’ undeclared here (not in a function)
seccompsandbox.c:63: error: ‘O_CLOEXEC’ undeclared here (not in a function)
make: *** [seccompsandbox.o] Error 1
Поскольку я не очень знаком с источником и окружающей средой, я понятия не имею, как это исправить. Я полагаю, что это как-то связано с новой песочницей фильтра seccomp. Поиск в Google показал мне, что ошибка воспроизводима, но решение не было отправлено.
Моя версия ядра Linux 2.6.32-5-amd64
и я использую версию GCC 4.4.5 (Debian 4.4.5-8)
Любые идеи приветствуются. (Если вам нужна дополнительная информация, не стесняйтесь спрашивать)
2 ответа
По крайней мере, на Debian O_DIRECTORY
а также O_CLOEXEC
определяются только если _GNU_SOURCE
определено.
Хотя _GNU_SOURCE
устанавливается для определенных модулей в текущем vsftp
релиз не установлен вообще.
В качестве обходного пути вы можете использовать следующий патч:
diff -Naur vsftpd-3.0.0.orig/seccompsandbox.c vsftpd-3.0.0/seccompsandbox.c
--- vsftpd-3.0.0.orig/seccompsandbox.c 2012-04-05 00:41:51.000000000 +0200
+++ vsftpd-3.0.0/seccompsandbox.c 2012-06-30 15:25:52.000000000 +0200
@@ -11,7 +11,7 @@
#include "seccompsandbox.h"
#if defined(__linux__) && defined(__x86_64__)
-
+#define _GNU_SOURCE
#include "session.h"
#include "sysutil.h"
#include "tunables.h
Отказ от ответственности: применение этого патча делает текущий vsftp
выпустить компиляцию, теперь я понимаю, работают ли созданные двоичные файлы правильно или нет.
Я использую SLES 11 sp1 64bit, ядро 2.6.32, gcc ver 4.3.4; изменение или удаление FORTIFY_SOURCE не имеет значения, вы получите ту же ошибку. Я не программист - флаги O_DIRECTORY и O_CLOEXEC находятся в seccompsandbox.c:
static const int kOpenFlags =
O_CREAT|O_EXCL|O_APPEND|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_LARGEFILE;
Он компилируется, если вы удалите их, но это действительно наполняет меня уверенностью....
Файл vrf_findlibs.sh также не работает, мне пришлось перенастроить скрипт, чтобы он сначала нашел 64-битную версию libcap, или он продолжает выбирать 32-битную копию (-lcap тоже не работает, говорит, что не найден):
# Look for libcap (capabilities)
if locate_library /lib64/libcap.so; then
echo "/lib64/libcap.so.2";
elif locate_library /lib/libcap.so.1; then
echo "/lib/libcap.so.1";
elif locate_library /lib/libcap.so.2; then
echo "/lib/libcap.so.2";
else
locate_library /usr/lib/libcap.so && echo "-lcap";
locate_library /lib/libcap.so && echo "-lcap";
locate_library /lib64/libcap.so && echo "-lcap";
fi