怎样将 VMware 16 自带的 GtkMM/GLibMM 替换成系统的库?

我用的是 VMware Workstation 16.2.5, 试图将它自带的大量库替换成系统里的库。其他都成功,唯独 GtkMM/GLibMM 替换不了。一旦替换掉,就运行不起来,从日志可以看到缺少某些符号。根据以往的经验,这种现象一般是 gcc/g++ 的 ABI 问题。然后试着用 g++ 自己编译 GtkMM, 通过添加选项 -D_GLIBCXX_USE_CXX11_ABI=0 以及调整 -fabi-version= 来改变 ABI. 但最终都没成功替换,可能没有设对选项参数。

哪位有过这种经验,知道该如何调整 g++ 的选项来编译 VMware Workstation 16.2.5 所需的 GtkMM? 或者如果你无须自己编译,安装上系统的 GtkMM, 并且删除 VMware 自带的 GtkMM/PangoMM/AtkMM/CairoMM/GLibMM, 让它自动用上系统的库。如果这时能够成功打开 VMware Workstation 16.2.5 的界面,麻烦将你的发行版告诉我,让我研究一下。

现在缺什么符号?

具体的符号没记下来,因为那都是一大串二进制的符号,可读性很差。反正就是 ABI 不兼容,你试过了就知道。

就要那个。据说 Vmware 只能用 gtkmm2 2.24.2。openSUSE 的是 2.24.5。得看具体缺什么符号才能确定。

不是. VMware 从 14.0 开始就转到了 GTK3, 对应的 GTKMM 自然也是 3.0 以上的版本。

另外我提供一个线索:对于老版的 VMware 12.5.9, 依然使用的是 GTK2. 我成功替换了它自带的库,并且就是用的 GTKMM 2.24.5. 只是编译的时侯要加上 -D_GLIBCXX_USE_CXX11_ABI=0 让 g++ 生成旧版的 ABI

但对于使用 GTK3/GTKMM3 的 VMware 来说,哪怕加上 -D_GLIBCXX_USE_CXX11_ABI=0 以及用上 -fabi-version= 来编译,依然无法成功替换它自带的 GTKMM 库。

可能还需要调整一些其他的编译选项。

今晚又找环境测试了一下,现在可以提供一些信息给你参考。

libvmwareui.so 需要的两个符号 _ZNK4Glib10ObjectBase4gobjEv, _ZN4Glib10ObjectBase4gobjEv 分别来自它自带的 libglibmm-2.4.so.1 和 libatkmm-1.6.so.1

但如果自己去编译 glibmm 和 atkmm, 就编译不出那两个符号。

当然那两个符号只是来用举例,实际上远远不止两个。

如果你是 VMware 16,建议你从 glibmm 2.73.2 往下试。openSUSE 依赖它的还有 telegram-desktop 和 t transmission,如果你不用那两个的话可以随便试

我的思路就是介于两个 VMware 版本之间的 glibmm 暴力穷举。

我试过,没有用。根据官方提供的文件:

open_source_license_VMware_Workstation_16.2.0_Pro_and_VMware_Workstation_16.2.0_Player_GA.txt

可以查到它似乎用的是古老的 glibmm-2.40.0

我特意用该版本去编译,依然没有效果。

应该不是版本问题,因为正常情况下, GNOME 系的软件很注重 ABI 兼容。只要 soname 没变,新版一般都能兼容旧版。我觉得要么是 gcc/g++ 的编译参数没设对,要么是 VMware 修改过 gtkmm/glibmm. 如果是后者,显然无法替换。不过具体是哪一种,可能需要对 ABI/Binutils 那一套东西有较深的理解才行。