Ich habe Wine von WineHQ auf meinem Ubuntu 16.04-Rechner installiert und erhalte die folgende Fehlermeldung:
/opt/wine-stable/bin/wine: error while loading shared libraries: libwine.so.1: cannot create shared object descriptor: Operation not permitted.
Antwort1
Kurze Antwort – führen Sie Folgendes aus:
sudo sysctl -w vm.mmap_min_addr=0
Längere Antwort:
Vor einem Tag ist mir nach dem Upgrade genau der gleiche Fehler unterlaufen.ausUbuntu 16.04 bis 18.04 (und Neuinstallation von Wine-Staging von WineHQ).
Ich konnte herausfinden, dass es nur beim Versuch auftrat, eine 32-Bit-Windows-ausführbare Datei über Wine (auf einem 64-Bit-System) auszuführen.
Nach viel zu viel Debugging habe ich einen Hinweis bekommen, als ich versucht habe, Wine notepad.exe unter folgendem Namen auszuführen 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 +++
Das Entscheidende ist das mmap2
Scheitern. Nach dem Lesendie mmap2
Manpage(und danndie mmap
Manpage), schien es, als würde es nur versuchen, einen anonymen Block von 8192 Bytes abzubilden – der nicht einmal mit einer Datei auf der Festplatte verknüpft war. Das schien extrem langweilig und nicht die Art von Sache, die fehlschlagen sollte.
Daher dachte ich, dass ich die sysctl
Einstellungen untersuchen könnte, um zu sehen, ob sich bei meinem Upgrade von Ubuntu 16.04 auf 18.04 möglicherweise etwas geändert hat, insbesondere irgendetwas, das Auswirkungen haben könnte mmap2
oder nur mmap
…
Einen möglichen Kandidaten habe ich gefunden in /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
Der Hauptgrund, warum dies ein starker Kandidat zu sein schien, ist die Erwähnung von Wine.
Danach habe ich diese Seite im WineHQ-Wiki gefunden:Problem mit der Preloader-Seite Null.
Während diese Seite nichtausdrücklichErwähnen Sie den Fehler, auf den wir gestoßen sind, es wurden viele andere Dinge erwähnt, die verdächtig ähnlich klangen.
Also habe ich die dort empfohlene „richtige Problemumgehung“ ausprobiert sudo sysctl -w vm.mmap_min_addr=0
und plötzlich konnte ich 32-Bit-Windows-Anwendungen wieder unter Wine ausführen! :-)
HINWEIS: Auf der WineHQ-Wiki-Seite finden Sie auch Anweisungen, wie Sie diese Änderung dauerhaft vornehmen können. Dies kann allerdings Auswirkungen auf die Systemsicherheit haben.