Error al cargar bibliotecas compartidas

Error al cargar bibliotecas compartidas

Instalé Wine desde WineHQ para mi máquina Ubuntu 16.04 y aparece el siguiente error:

/opt/wine-stable/bin/wine: error while loading shared libraries: libwine.so.1: cannot create shared object descriptor: Operation not permitted.

Respuesta1

Respuesta corta: ejecute esto:

sudo sysctl -w vm.mmap_min_addr=0

Respuesta más larga:

Me encontré exactamente con el mismo error hace un día después de actualizardeUbuntu 16.04 a 18.04 (y reinstalar Wine-staging desde WineHQ).

Pude darme cuenta de que solo ocurría cuando intentaba ejecutar un ejecutable de Windows de 32 bits a través de Wine (en un sistema de 64 bits).

Después de demasiada depuración, obtuve una pista al intentar ejecutar Wine notepad.exe en 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 +++

Lo crucial es el mmap2fracaso. Despues de leerla mmap2página de manual(y luegola mmappágina de manual), parecía como si simplemente estuviera intentando mapear un bloque anónimo de 8192 bytes, ni siquiera vinculado a un archivo en el disco. Eso parecía extremadamente aburrido y no era el tipo de cosa que debería fracasar.

Así que pensé en investigar la sysctlconfiguración para ver si había algo que pudiera haberse cambiado en mi actualización de Ubuntu 16.04 → 18.04, en particular algo que pudiera afectar mmap2o simplemente mmap.

Encontré un candidato probable en /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

La razón principal por la que parecía un candidato fuerte es porque mencionaba Wine.

Después de eso, encontré esta página en WineHQ Wiki:Problema cero de la página del precargador.

Si bien esa página noexplícitamentemencionar el error que encontramos, mencionó muchas otras cosas que parecían sospechosamente relacionadas.

Así que probé su recomendación para “la solución alternativa correcta”, es decir, sudo sysctl -w vm.mmap_min_addr=0¡y de repente pude ejecutar aplicaciones de Windows de 32 bits en Wine nuevamente! :-)

NOTA: La página Wiki de WineHQ también brinda instrucciones para hacer que ese cambio sea permanente, aunque puede haber algunas implicaciones para la seguridad del sistema si lo hace.

información relacionada