2017年4月29日 星期六

gcc 昇級至 5.0 後,vmware-workstation 無法執行

某天,在將 gcc 切換至 5.0 之後,將 libtool 重新 emerge 之後,看起來都正常。
隔天,就陸續出現一些問題,vmware 也開不起來了。依據說明,將相關的程式 rebuild
revdep-rebuild --library 'libstdc++.so.6' -- --exclude gcc
也還是不行,執行 vmware 會出現 Caught signal 11 的訊息。

將 USE 加上 bundled-libs,重新 emerge app-emulation/vmware-workstation,還是不行。

在啟動後,會產生4個 log 檔,位於 /tmp/vmware-ajax 下。比對 log,在 HostDeviceInfo_FindHostCDROMs 之後,就出現 Caught signal 11 -- tid 5274 (addr 2500) 的錯誤了

 vmware-ui-5274.log
-------------------------
2017-05-01T08:53:04.773+08:00| vmui| I125: vmxFilePathStats="/opt/vmware/lib/vmware/bin/vmware-vmx-stats"
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfo_FindHostCDROMs: enumerating IDE CDROMs
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfoFindHostIDECDROMs: /proc/ide could not be explored. Unable to enumerate host IDE cdroms.
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfo_FindHostCDROMs: IDE CDROM enumerating completed
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfo_FindHostCDROMs: enumerating SCSI CDROMs
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfoCheckDevCDROM: can't stat /dev/cdrom: No such file or directory
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfo_FindHostCDROMs: SCSI CDROM enumerating completed
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfo_FindHostCDROMs: enumerating CDROMs in VSI
2017-05-01T08:53:04.777+08:00| vmui| I125: HostDeviceInfo_FindHostCDROMs: VSI CDROM enumerating completed
2017-05-01T08:53:04+08:00[+0.007]| vmui| W115: Caught signal 11 -- tid 5274 (addr 2500)
2017-05-01T08:53:04+08:00[+0.007]| vmui| I125: SIGNAL: rip 0x2500 rsp 0x7ffe16463d38 rbp 0x1
2017-05-01T08:53:04+08:00[+0.007]| vmui| I125: SIGNAL: rax 0x0 rbx 0x7fd4223bed28 rcx 0x55931e74b510 rdx 0x55931e74b510 rsi 0x7ffe16465a68 rdi 0x1
2017-05-01T08:53:04+08:00[+0.007]| vmui| I125:         r8 0x55931ec96b20 r9 0x2f r10 0x30 r11 0x55931ec9bb00 r12 0x7ffe16465a68 r13 0x55931e74b510 r14 0x7fd4223bed30 r15 0x0
2017-05-01T08:53:04+08:00[+0.007]| vmui| I125: SIGNAL: stack 7FFE16463D38 : 0x00007fd43146433a 0x0000000000000018

-------------------------------

從 log 中,可看出在 check CDROM 之後,就出現 caught signal 11 的錯誤。乾脆,狠下心來,重新安裝 OS,在只裝 xorg-server 後,可以執行 vmware。但是在設成 gnome+systemd 的設定,裝好 xfce 的環境後,就又起不來了。經過幾天的嘗試,不斷的在網路找答案,都沒辦法啟動。最後,大概判斷可能是glib 的問題。

gcc-5.0 之後,使用新的 C++11 ABI,因此,會造成一些錯誤。而在 vmware 中,會檢查 lib 的版本,判斷要使用 system 或 shipped 的 lib,有可能,在夾雜使用的情況下,就無法啟動了。

最後,決定將 gcc 降回 gcc-4.9.4,反正使用 gcc-5.0 或 gcc-4.9,對我來講,好像都沒差,雖然,使用 Gentoo Linux 樂趣之一,就是不斷的對各個 package 昇級。

在 gcc 版本降級之後,USE 的 bundled-libs 拿掉,重新 emerge app-emulation/vmware-workstation 和 app-emulation/vmware-modules
然後,重新啟動 vmware,

vmware-apploader-5274.log 中出現的錯誤訊息如下
-------------------------------
2017-05-03T12:44:44.719+08:00| appLoader| I125: Loading shipped version of libvmwareui.so.
2017-05-03T12:44:44.826+08:00| appLoader| W115: Unable to load libvmwareui.so from /opt/vmware/lib/vmware/lib/libvmwareui.so/libvmwareui.so: /opt/vmware/lib/vmware/lib/libvmwareui.so/libvmwareui.so: undefined symbol: _ZN4Glib10spawn_syncERKSsRKNS_11ArrayHandleISsNS_17Container_Helpers10TypeTraitsISsEEEENS_10SpawnFlagsERKN4sigc4slotIvNSA_3nilESC_SC_SC_SC_SC_SC_EEPSsSG_Pi
2017-05-03T12:44:44.826+08:00| appLoader| W115: Unable to load dependencies for /opt/vmware/lib/vmware/lib/libvmware.so/libvmware.so
2017-05-03T12:44:44.826+08:00| appLoader| W115: Unable to execute vmware.

-------------------------------

後來,依據 vmware-workstation-12.5.4.5192485.ebuild 中的相依 package 列表,將相關的 package 重新 emerge,將重新 build 其中幾個關鍵的 package 之後,vmware 就可以啟動了。後來,為了以防萬一,全部重新 build。

在出問題的其間,也用了 virtualbox,碰到一個比較嚴重的問題是,透過網芳連 freebsd 的 samba server,速度奇慢,因而決定放棄 virtualbox,另外,也比較習慣 vmware。所以,只有等那時候 vmware 也可以用 gcc-5.0 之後,再將 gcc 的版本昇上去吧。

要將 gcc 版本昇級,很簡單,照做就是了。但是要降級,就沒有指引了,不時會出現這樣的錯誤,
workrave: symbol lookup error: workrave: undefined symbol: _ZN4Glib7ustringC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE 

就只能重新 emerge 相關的 package 了,錯一個裝一個吧。


降級 gcc-4.9.4

官方只有升級的說明,沒有降級的說明,關於降級,只有警告而已。但不論如何,為了使用 vmware-workstation,只能把 gcc 降級。就參考 gentoo gcc 升級的 wiki,開始囉。
root #emerge -av gcc:4.9.4
root #gcc-config --list-profiles
 [1] x86_64-pc-linux-gnu-4.9.4
 [2] x86_64-pc-linux-gnu-5.4.0 *
root #gcc-config 1
root #env-update && source /etc/profile 
root #gccgcc
root #emerge --ask --oneshot sys-devel/libtool
root #revdep-rebuild --library 'libstdc++\.so\.5'
root #revdep-rebuild --library 'libstdc++.so.6' -- --exclude gcc
root #emerge --ask --oneshot --verbose dev-libs/boost

rebuild 會幾乎把所有的 package 都重新裝一次,電腦速度若不快,也許會跑一整天吧,但也沒辦法啦。尤其是,新裝的系統,預設就是 gcc-5.4.0 了,非降級不可。


2017-10-06 補記

最近,裝 Chromium 一定要 gcc 5.0 以上,甚至已經做出放棄 chromium 的打算。試試運氣,再搜尋一下答案,發現在 Gentoo 的討論區,已有人解決此問題,連結如下
https://forums.gentoo.org/viewtopic-t-1063880-start-0.html

原想自己改 ebuild 檔,可是 trace 一下 git 上的 commit 紀錄,發現大約在 5 月多,就已經做了修正,甚至不需要加上 bundled-libs 的 USE flag。

將 gcc 升級後,按照步驟,全部重來一次,全部正常,真是太棒了。

沒有留言: