공유 라이브러리를 로드하는 중 오류가 발생했습니다.

공유 라이브러리를 로드하는 중 오류가 발생했습니다.

Ubuntu 16.04 시스템용 WineHQ에서 Wine을 설치했는데 다음 오류가 발생합니다.

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

답변1

짧은 대답 – 다음을 실행하십시오.

sudo sysctl -w vm.mmap_min_addr=0

더 긴 답변:

하루 전 업그레이드 후 정확히 같은 오류가 발생했습니다.~에서Ubuntu 16.04 ~ 18.04(및 WineHQ에서 와인 준비 재설치)

Wine을 통해(64비트 시스템에서) 32비트 Windows 실행 파일을 실행하려고 할 때만 이 문제가 발생한다는 것을 알아낼 수 있었습니다.

너무 많은 디버깅을 한 후 다음에서 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실패이다. 읽고 나서mmap2페이지(그런 다음mmap페이지), 디스크의 파일에 연결되지 않은 8192바이트의 익명 블록을 매핑하려는 것 같았습니다. 그것은 매우 지루해 보였고 실패할 일은 아닌 것 같았습니다.

그래서 sysctlUbuntu 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에서 다음 페이지를 찾았습니다.프리로더 페이지 제로 문제.

그 페이지는 그렇지 않지만명시적으로우리가 겪은 오류에 대해 언급했는데, 의심스러운 관련이 있는 다른 많은 것들이 언급되었습니다.

그래서 저는 "올바른 해결 방법"에 대한 권장 사항을 시도해 보았습니다. 즉, sudo sysctl -w vm.mmap_min_addr=0갑자기 Wine에서 Windows 32비트 앱을 다시 실행할 수 있게 되었습니다! :-)

참고: WineHQ Wiki 페이지에서는 해당 변경 사항을 영구적으로 적용하는 방법에 대한 지침도 제공합니다. 단, 그렇게 하면 시스템 보안에 영향을 미칠 수 있습니다.

관련 정보