AOSC-Dev / liblol

libLoL (LoongArch on LoongArch): Old-world ABI compatibility runtime
33 stars 1 forks source link

百度网盘无法启动 #10

Open MingcongBai opened 8 months ago

MingcongBai commented 8 months ago

使用 libLoL 0.1.3 及 0.1.4~pre4,百度网盘均无法启动,报错如下:

mingcongbai@JellyCambarellus [ baidunetdisk ] $ ./baidunetdisk 
free(): invalid pointer
已放弃(核心已转储)

GDB backtrace (0.1.3)

(gdb) bt
#0  0x00007ffff53c6e44 in __pthread_kill_implementation
    (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0)
    at ./src/glibc/nptl/pthread_kill.c:43
#1  0x00007ffff53c6eb4 in __pthread_kill_internal
    (signo=6, threadid=<optimized out>) at ./src/glibc/nptl/pthread_kill.c:78
#2  0x00007ffff537c35c in __GI_raise (sig=sig@entry=6)
    at ../sysdeps/posix/raise.c:26
#3  0x00007ffff53669f0 in __GI_abort () at ./src/glibc/stdlib/abort.c:79
#4  0x00007ffff53b8c78 in __libc_message (fmt=fmt@entry=0x7ffff54b1a50 "%s\n")
    at ../sysdeps/posix/libc_fatal.c:150
#5  0x00007ffff53d3614 in malloc_printerr
    (str=str@entry=0x7ffff54acd60 "free(): invalid pointer")
    at ./src/glibc/malloc/malloc.c:5879
#6  0x00007ffff53d5670 in _int_free
    (av=<optimized out>, p=<optimized out>, have_lock=have_lock@entry=0)
    at ./src/glibc/malloc/malloc.c:4501
#7  0x00007ffff53d8494 in __GI___libc_free (mem=<optimized out>)
    at ./src/glibc/malloc/malloc.c:3386
#8  0x0000555558a5c0ec in ??? ()
MingcongBai commented 8 months ago

另附百度网盘一处疑似发行质量问题:/opt/baidunetdisk/chrome-sandbox 应为 root:root 所有并带有 4755 权限位,但安装软件包后发现是 755;他们在 /usr/share/applications/baidunetdisk.desktop 中使用 --no-sandbox 绕过了这一问题,不开沙箱功能的原因不详,但最好报告反馈一下

shankerwangmiao commented 8 months ago

该错误现象疑似因为载入了不正确的 so,建议以此为入口开始排查。

MingcongBai commented 8 months ago

该错误疑似因为载入了不正确的 so,建议以此为入口开始排查。

经查,baidunetdisk 中只有 libEGL.solibGLES.so 两个库可以删除,其余都是应用必须的 CEF 库,不能删;删除后症状依旧

shankerwangmiao commented 8 months ago

经查,情况和 #8 一致,都是因为没有正确连接 openssl 所致,涉及的 so 有:

MingcongBai commented 8 months ago

经查,情况和 #8 一致,都是因为没有正确连接 openssl 所致,涉及的 so 有:

* `libbrowserengine.so`
* `libkernel.so`
* `libminosagent.so`
* `libplayer.so`

啧,那就只能报告给厂商了

shankerwangmiao commented 8 months ago

经查,情况和 #8 一致,都是因为没有正确连接 openssl 所致,涉及的 so 有:

  • libbrowserengine.so
  • libkernel.so
  • libminosagent.so
  • libplayer.so

百度网盘的情况和 #8 不完全一致,在钉钉中,是本应动态链接 libssl 却未能在链接时指定,导致 SSL 相关符号缺少定义。在百度网盘中,情况时上述四个动态链接库静态链接了 libssl,却误将静态连接进来的 libssl 的符号又作为动态符号导出了。上述行为致使在启动后,这四个动态链接库用到的 SSL 相关符号被指向了系统提供的 openssl 3.0 的同名符号。

该问题的解决办法为:增加 -Wl,--version-script=version-script 选项,并在 version-script 中使用形如 {global: foo; bar; local: *;} 的指令显式指定要导出的符号。

同时,上述动态链接库也存在未能连接系统库,致使出现符号缺少定义的情况:

因此可以推知,这些 so 文件在链接时也未能使用 -Wl,-z,defs 避免缺少链接必要的动态链接库。