Я установил Wine из WineHQ для своего компьютера с Ubuntu 16.04 и получаю следующую ошибку:
/opt/wine-stable/bin/wine: error while loading shared libraries: libwine.so.1: cannot create shared object descriptor: Operation not permitted.
Я установил Wine из WineHQ для своего компьютера с Ubuntu 16.04 и получаю следующую ошибку:
/opt/wine-stable/bin/wine: error while loading shared libraries: libwine.so.1: cannot create shared object descriptor: Operation not permitted.
Краткий ответ - запустите это:
sudo sysctl -w vm.mmap_min_addr=0
Более длинный ответ:
Я столкнулся с точно такой же ошибкой день назад после обновления с Ubuntu 16.04 до 18.04 (и переустановки wine-staging из WineHQ).
Мне удалось выяснить, что это произошло только при попытке запустить 32-разрядный исполняемый файл Windows через Wine (в 64-разрядной системе).
После слишком большой отладки я получил подсказку, пытаясь запустить Wine notepad.exe под strace
:
$ strace /usr/bin/wine notepad.exe
execve("/usr/bin/wine", ["/usr/bin/wine", "notepad.exe"], 0x7ffc266e8478 /* 55 vars */) = 0
strace: [ Process PID=19507 runs in 32 bit mode. ]
brk(NULL) = 0x7c423000
[ … 140 lines snipped … ]
openat(AT_FDCWD, "/opt/wine-staging/lib/libwine.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220d\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=1832828, ...}) = 0
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 EPERM (Operation not permitted)
close(3) = 0
writev(2, [{iov_base="/opt/wine-staging/bin/wine", iov_len=26}, {iov_base=": ", iov_len=2}, {iov_base="error while loading shared libra"..., iov_len=36}, {iov_base=": ", iov_len=2}, {iov_base="libwine.so.1", iov_len=12}, {iov_base=": ", iov_len=2}, {iov_base="cannot create shared object desc"..., iov_len=38}, {iov_base=": ", iov_len=2}, {iov_base="Operation not permitted", iov_len=23}, {iov_base="\n", iov_len=1}], 10/opt/wine-staging/bin/wine: error while loading shared libraries: libwine.so.1: cannot create shared object descriptor: Operation not permitted
) = 144
exit_group(127) = ?
+++ exited with 127 +++
Критическим моментом является сбой mmap2
. После прочтения man- mmap2
(а затем и man- страницы mmap
) казалось, что она просто пытается отобразить анонимный блок размером 8192 байта - даже не связанный с файлом на диске. Это казалось чрезвычайно скучным и не таким, что должно провалиться.
Поэтому я решил изучить настройки sysctl
, чтобы выяснить, не было ли что-то, что могло бы быть изменено в моем обновлении Ubuntu 16.04 → 18.04, в частности что-либо, что могло бы повлиять на mmap2
или просто на mmap
.
Я нашел вероятного кандидата в /etc/sysctl.d/10-zeropage.conf
:
# Protect the zero page of memory from userspace mmap to prevent kernel
# NULL-dereference attacks against potential future kernel security
# vulnerabilities. (Added in kernel 2.6.23.)
#
# While this default is built into the Ubuntu kernel, there is no way to
# restore the kernel default if the value is changed during runtime; for
# example via package removal (e.g. wine, dosemu). Therefore, this value
# is reset to the secure default each time the sysctl values are loaded.
vm.mmap_min_addr = 65536
Основная причина, по которой это показалось сильным кандидатом, заключается в том, что в нем упоминается вино.
После этого я обнаружил эту страницу в WineHQ Wiki: Preloader Page Zero Problem.
Хотя эта страница явно не упоминает об ошибке, с которой мы столкнулись, она упоминала много других вещей, которые звучали подозрительно связанными
Поэтому я попробовал его рекомендацию для «правильного обходного пути», то есть sudo sysctl -w vm.mmap_min_addr=0
- и вдруг я снова смог запустить 32-битные приложения Windows под Wine! :-)
ПРИМЕЧАНИЕ. На странице WineHQ Wiki также содержатся инструкции, как сделать это изменение постоянным, хотя в этом случае могут возникнуть некоторые проблемы с безопасностью системы.