安装了AUR的wechat-bin包,它提供了/opt/wechat/wechat,我正在尝试用bwrap沙盒化它。但是在启动它时遇到了动态链接库无法加载的问题。
使用的脚本如下
/usr/bin/bwrap
--unshare-cgroup
--symlink usr/lib /lib
--symlink usr/lib /lib64
--ro-bind /usr/lib /usr/lib
--ro-bind /usr/bin /usr/bin
--ro-bind /run /run
--ro-bind /etc /etc
--ro-bind /usr/share /usr/share
--ro-bind /run /run
--ro-bind /opt /opt
/opt/wechat/wechat
然后就会报错, /opt/wechat/wechat: error while loading shared libraries: libandromeda.so: cannot open shared object file: No such file or directory,而不使用bwrap直接运行时没有报错。我又双叒叕少bind了什么东西呢?
虽然我感觉以下这些尝试都没啥用,但是为了防止有人说我没有努力还是贴一下:
我尝试将脚本最后一行的/opt/wechat/wechat改为/usr/bin/bash后问题消失了,于是我怀疑是wechat链接了奇怪的库,于是我检查了ldd /opt/wechat/wechat以及readelf -d /opt/wechat/wechat,结果发现wechat链接了自身目录的某些动态链接库。
[xtricman@DESKTOP-BFOE35J ~]$ ldd /opt/wechat/wechat
linux-vdso.so.1 (0x00007f8f15c8f000)
libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x00007f8f15afb000)
libatomic.so.1 => /usr/lib/libatomic.so.1 (0x00007f8f15af0000)
libXcomposite.so.1 => /usr/lib/libXcomposite.so.1 (0x00007f8f15aeb000)
libXrender.so.1 => /usr/lib/libXrender.so.1 (0x00007f8f15adf000)
libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0x00007f8f15ad2000)
libudev.so.1 => /usr/lib/libudev.so.1 (0x00007f8f0d5b8000)
libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f8f0d474000)
libXext.so.6 => /usr/lib/libXext.so.6 (0x00007f8f0d460000)
libXtst.so.6 => /usr/lib/libXtst.so.6 (0x00007f8f0d458000)
libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0x00007f8f0d453000)
libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0x00007f8f0d44b000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00007f8f0d3f8000)
libandromeda.so => /opt/wechat/libandromeda.so (0x00007f8f0ce00000)
libconfService.so => /opt/wechat/libconfService.so (0x00007f8f0ca00000)
libilink2.so => /opt/wechat/libilink2.so (0x00007f8f0c600000)
libilink_network.so => /opt/wechat/libilink_network.so (0x00007f8f0ba00000)
libilink_protobuf.so => /opt/wechat/libilink_protobuf.so (0x00007f8f0b600000)
libowl.so => /opt/wechat/libowl.so (0x00007f8f0b200000)
libvoipChannel.so => /opt/wechat/libvoipChannel.so (0x00007f8f0ae00000)
libvoipCodec.so => /opt/wechat/libvoipCodec.so (0x00007f8f08800000)
libvoipComm.so => /opt/wechat/libvoipComm.so (0x00007f8f08400000)
libmmmojo.so => /opt/wechat/libmmmojo.so (0x00007f8f08000000)
libz.so.1 => /usr/lib/libz.so.1 (0x00007f8f0d3db000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f8f0d3d6000)
libxkbcommon.so.0 => /usr/lib/libxkbcommon.so.0 (0x00007f8f0c9a3000)
libxkbcommon-x11.so.0 => /usr/lib/libxkbcommon-x11.so.0 (0x00007f8f0d3ca000)
libxcb-glx.so.0 => /usr/lib/libxcb-glx.so.0 (0x00007f8f0cde3000)
libxcb-xkb.so.1 => /usr/lib/libxcb-xkb.so.1 (0x00007f8f0c5e1000)
libxcb-randr.so.0 => /usr/lib/libxcb-randr.so.0 (0x00007f8f0cdd1000)
libxcb-icccm.so.4 => /usr/lib/libxcb-icccm.so.4 (0x00007f8f0d3c3000)
libxcb-shm.so.0 => /usr/lib/libxcb-shm.so.0 (0x00007f8f0cdcc000)
libxcb-render.so.0 => /usr/lib/libxcb-render.so.0 (0x00007f8f0c5d2000)
libxcb-image.so.0 => /usr/lib/libxcb-image.so.0 (0x00007f8f0c99d000)
libxcb-xfixes.so.0 => /usr/lib/libxcb-xfixes.so.0 (0x00007f8f0c5c9000)
libxcb-shape.so.0 => /usr/lib/libxcb-shape.so.0 (0x00007f8f0c5c3000)
libxcb-sync.so.1 => /usr/lib/libxcb-sync.so.1 (0x00007f8f0c5ba000)
libxcb-render-util.so.0 => /usr/lib/libxcb-render-util.so.0 (0x00007f8f0c5b4000)
libxcb-keysyms.so.1 => /usr/lib/libxcb-keysyms.so.1 (0x00007f8f0c5af000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007f8f0c584000)
libX11-xcb.so.1 => /usr/lib/libX11-xcb.so.1 (0x00007f8f0b9fb000)
libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x00007f8f0b9aa000)
libdbus-1.so.3 => /usr/lib/libdbus-1.so.3 (0x00007f8f0b957000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007f8f0b839000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f8f0b5d3000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f8f0b834000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f8f0820f000)
/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f8f15c91000)
librt.so.1 => /usr/lib/librt.so.1 (0x00007f8f0b82f000)
libpcre2-8.so.0 => /usr/lib/libpcre2-8.so.0 (0x00007f8f0ad52000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x00007f8f0873a000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x00007f8f0b5a6000)
libcom_err.so.2 => /usr/lib/libcom_err.so.2 (0x00007f8f0b5a0000)
libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x00007f8f0b592000)
libkeyutils.so.1 => /usr/lib/libkeyutils.so.1 (0x00007f8f0b58b000)
libresolv.so.2 => /usr/lib/libresolv.so.2 (0x00007f8f0b579000)
libnss3.so => /usr/lib/libnss3.so (0x00007f8f07ec1000)
libnssutil3.so => /usr/lib/libnssutil3.so (0x00007f8f0b54c000)
libnspr4.so => /usr/lib/libnspr4.so (0x00007f8f0ad12000)
libsmime3.so => /usr/lib/libsmime3.so (0x00007f8f0870e000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f8f07c00000)
libxcb-util.so.1 => /usr/lib/libxcb-util.so.1 (0x00007f8f0b546000)
libXau.so.6 => /usr/lib/libXau.so.6 (0x00007f8f0b541000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f8f0b539000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007f8f0863e000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007f8f07e96000)
libsystemd.so.0 => /usr/lib/libsystemd.so.0 (0x00007f8f07ada000)
libplds4.so => /usr/lib/libplds4.so (0x00007f8f0b534000)
libplc4.so => /usr/lib/libplc4.so (0x00007f8f0b52d000)
libbz2.so.1.0 => /usr/lib/libbz2.so.1.0 (0x00007f8f0b1ed000)
libpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f8f07a9f000)
libbrotlidec.so.1 => /usr/lib/libbrotlidec.so.1 (0x00007f8f0b1de000)
libbrotlicommon.so.1 => /usr/lib/libbrotlicommon.so.1 (0x00007f8f07a7c000)
[xtricman@DESKTOP-BFOE35J ~]$ readelf -d /opt/wechat/wechat
Dynamic section at offset 0x82e1bf8 contains 74 entries:
标记 类型 名称/值
0x000000000000001d (RUNPATH) Library runpath: [${ORIGIN}]
0x0000000000000001 (NEEDED) 共享库:[libglib-2.0.so.0]
0x0000000000000001 (NEEDED) 共享库:[libatomic.so.1]
0x0000000000000001 (NEEDED) 共享库:[libXcomposite.so.1]
0x0000000000000001 (NEEDED) 共享库:[libXrender.so.1]
0x0000000000000001 (NEEDED) 共享库:[libXrandr.so.2]
0x0000000000000001 (NEEDED) 共享库:[libudev.so.1]
0x0000000000000001 (NEEDED) 共享库:[libX11.so.6]
0x0000000000000001 (NEEDED) 共享库:[libXext.so.6]
0x0000000000000001 (NEEDED) 共享库:[libXtst.so.6]
0x0000000000000001 (NEEDED) 共享库:[libXdamage.so.1]
0x0000000000000001 (NEEDED) 共享库:[libXfixes.so.3]
0x0000000000000001 (NEEDED) 共享库:[libgssapi_krb5.so.2]
0x0000000000000001 (NEEDED) 共享库:[libandromeda.so]
0x0000000000000001 (NEEDED) 共享库:[libconfService.so]
0x0000000000000001 (NEEDED) 共享库:[libilink2.so]
0x0000000000000001 (NEEDED) 共享库:[libilink_network.so]
0x0000000000000001 (NEEDED) 共享库:[libilink_protobuf.so]
0x0000000000000001 (NEEDED) 共享库:[libowl.so]
0x0000000000000001 (NEEDED) 共享库:[libvoipChannel.so]
0x0000000000000001 (NEEDED) 共享库:[libvoipCodec.so]
0x0000000000000001 (NEEDED) 共享库:[libvoipComm.so]
0x0000000000000001 (NEEDED) 共享库:[libmmmojo.so]
0x0000000000000001 (NEEDED) 共享库:[libz.so.1]
0x0000000000000001 (NEEDED) 共享库:[libdl.so.2]
0x0000000000000001 (NEEDED) 共享库:[libxkbcommon.so.0]
0x0000000000000001 (NEEDED) 共享库:[libxkbcommon-x11.so.0]
0x0000000000000001 (NEEDED) 共享库:[libxcb-glx.so.0]
0x0000000000000001 (NEEDED) 共享库:[libxcb-xkb.so.1]
0x0000000000000001 (NEEDED) 共享库:[libxcb-randr.so.0]
0x0000000000000001 (NEEDED) 共享库:[libxcb-icccm.so.4]
0x0000000000000001 (NEEDED) 共享库:[libxcb-shm.so.0]
0x0000000000000001 (NEEDED) 共享库:[libxcb-render.so.0]
0x0000000000000001 (NEEDED) 共享库:[libxcb-image.so.0]
0x0000000000000001 (NEEDED) 共享库:[libxcb-xfixes.so.0]
0x0000000000000001 (NEEDED) 共享库:[libxcb-shape.so.0]
0x0000000000000001 (NEEDED) 共享库:[libxcb-sync.so.1]
0x0000000000000001 (NEEDED) 共享库:[libxcb-render-util.so.0]
0x0000000000000001 (NEEDED) 共享库:[libxcb-keysyms.so.1]
0x0000000000000001 (NEEDED) 共享库:[libxcb.so.1]
0x0000000000000001 (NEEDED) 共享库:[libX11-xcb.so.1]
0x0000000000000001 (NEEDED) 共享库:[libfontconfig.so.1]
0x0000000000000001 (NEEDED) 共享库:[libdbus-1.so.3]
0x0000000000000001 (NEEDED) 共享库:[libm.so.6]
0x0000000000000001 (NEEDED) 共享库:[libgcc_s.so.1]
0x0000000000000001 (NEEDED) 共享库:[libpthread.so.0]
0x0000000000000001 (NEEDED) 共享库:[libc.so.6]
0x0000000000000001 (NEEDED) 共享库:[ld-linux-x86-64.so.2]
0x0000000000000001 (NEEDED) 共享库:[librt.so.1]
0x000000006ffffffb (FLAGS_1) 标志: PIE
0x0000000000000015 (DEBUG) 0x0
0x0000000000000007 (RELA) 0xc8f8
0x0000000000000008 (RELASZ) 10240848 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffff9 (RELACOUNT) 426634
0x0000000000000017 (JMPREL) 0x9d0c48
0x0000000000000002 (PLTRELSZ) 25296 (bytes)
0x0000000000000003 (PLTGOT) 0x84614c0
0x0000000000000014 (PLTREL) RELA
0x0000000000000006 (SYMTAB) 0x340
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000005 (STRTAB) 0x7500
0x000000000000000a (STRSZ) 21492 (bytes)
0x000000006ffffef5 (GNU_HASH) 0x74d8
0x0000000000000019 (INIT_ARRAY) 0x7fa6618
0x000000000000001b (INIT_ARRAYSZ) 7568 (bytes)
0x000000000000001a (FINI_ARRAY) 0x7fa6600
0x000000000000001c (FINI_ARRAYSZ) 24 (bytes)
0x000000000000000c (INIT) 0x7fa103c
0x000000000000000d (FINI) 0x7fa1058
0x000000006ffffff0 (VERSYM) 0x69b8
0x000000006ffffffe (VERNEED) 0x7244
0x000000006fffffff (VERNEEDNUM) 12
0x0000000000000000 (NULL) 0x0
于是我怀疑是不是动态链接器在ns内运行时会有一些对DT_RUNPATH的奇怪处理,尝试运行了unshare -c -m -C /opt/wechat/wechat来模拟ns中运行wechat,发现并不会报错,所以问题应该还是单纯的我少bind了一些东西。