Erro ao carregar bibliotecas compartilhadas

Erro ao carregar bibliotecas compartilhadas

Instalei o Wine do WineHQ para minha máquina Ubuntu 16.04 e recebo o seguinte erro:

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

Responder1

Resposta curta – execute isto:

sudo sysctl -w vm.mmap_min_addr=0

Resposta mais longa:

Encontrei exatamente o mesmo erro há um dia após a atualizaçãodeUbuntu 16.04 a 18.04 (e reinstalando o wine-staging do WineHQ).

Consegui descobrir que isso só acontecia ao tentar executar um executável do Windows de 32 bits via Wine (em um sistema de 64 bits).

Depois de muita depuração, tive uma pista ao tentar executar o Wine notepad.exe em 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 +++

A parte crucial é o mmap2fracasso. Depois de lera mmap2página de manual(e entãoa mmappágina de manual), parecia que ele estava apenas tentando mapear um bloco anônimo de 8.192 bytes – nem mesmo vinculado a um arquivo no disco. Isso parecia extremamente chato e não era o tipo de coisa que deveria falhar.

Então pensei em investigar as sysctlconfigurações para ver se havia algo que pudesse ter sido alterado na minha atualização do Ubuntu 16.04 → 18.04, em particular qualquer coisa que pudesse afetar mmap2ou apenas mmap.

Encontrei um provável candidato em /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

A principal razão pela qual este parecia um candidato forte é porque mencionava o Vinho.

Depois disso, encontrei esta página no WineHQ Wiki:Problema zero da página do pré-carregador.

Embora essa página nãoexplicitamentemencionar o erro que encontramos, ele mencionou muitas outras coisas que pareciam suspeitamente relacionadas.

Então tentei sua recomendação para “a solução alternativa certa”, ou seja, sudo sysctl -w vm.mmap_min_addr=0– e de repente pude executar aplicativos do Windows de 32 bits no Wine novamente! :-)

NOTA: A página Wiki do WineHQ também fornece instruções para tornar essa alteração permanente, embora possa haver algumas implicações na segurança do sistema se você fizer isso.

informação relacionada