這篇文章是除錯紀錄與寫給 Power User/Geek 參考服用,一般使用者請等 googleearth-package (Ubuntu) 正式版修正。

今天用 Holux M-241 紀錄了一段騎自行車的路程,本想取出 KML 來丟進 Google Earth 看一下到底繞了多遠。結果久久沒用的 Google Earth 一開即當,看了看還在 4.2 版。於是決定升級一下,發現 Google Earth for Linux 的支援相當糟糕。

在 Debian/Ubuntu 上,你可使用 googleearth-package 這個工具,來幫你把 googleearth 包裝成 deb 格式。於是你可以用 dpkg 來安裝、管理。相較於 Google Earth 原本提供的安裝方式,這樣顯然乾淨多了。不過試了幾次,發現 Google Earth 啟動後瞬間就會當掉,並存了一份 Crashlog 在 ${HOME}/.googleearth/crashlogs/。

於是開始了除錯旅程。我的環境是 Debian Sid.

Google 官方版本

決定手動下載安裝看看,很悲慘的是一執行 GoogleEarthLinux.bin 就出現以下錯誤

Verifying archive integrity... All good.
Uncompressing Google Earth for GNU/Linux 5.2.1.1588..............................................................
setup.data/setup.xml:1: parser error : Document is empty

^
setup.data/setup.xml:1: parser error : Start tag expected, '<' not found

^
Couldn't load 'setup.data/setup.xml'

你必須這樣做之後才能正確啟動安裝程式

$ sh GoogleEarthLinux.bin --target /tmp/ge
$ cd /tmp/ge
$ mv -fv setup.data/bin/Linux/x86/setup.gtk /tmp/ge/setup.data/bin/Linux/x86/setup.gtk2
$ ./setup.sh

安裝完畢之後,你會發現啟動 Google Earth 時,閃過幾個畫面,console 訊息會告訴你 Google Earth has caught signal 11.

你可以在 ${HOME}/.googleearth/crashlogs/ 找到當機的軟體日誌。你可能會看到以下訊息

Stacktrace from glibc:
./libgoogleearth_free.so(+0xd090b)[0xb773090b]
[0xb7789400]
/usr/lib/libgdk_pixbuf-2.0.so.0(gdk_pixbuf_from_pixdata+0x13f)[0x94979daf]
/usr/lib/libgdk_pixbuf-2.0.so.0(gdk_pixbuf_new_from_inline+0x63)[0x9497a073]
/usr/lib/flashplugin-nonfree/libflashplayer.so(+0x4d335)[0x94f7d335]
/usr/lib/flashplugin-nonfree/libflashplayer.so(+0x4bd8e)[0x94f7bd8e]
/usr/lib/flashplugin-nonfree/libflashplayer.so(NP_Initialize+0x1ae)[0x94f8028e]
./libQtWebKit.so.4(+0x747b22)[0xb62edb22]
./libQtWebKit.so.4(+0x747c0c)[0xb62edc0c]
./libQtWebKit.so.4(+0x6062ff)[0xb61ac2ff]
./libQtWebKit.so.4(+0x604516)[0xb61aa516]
./libQtWebKit.so.4(+0x60476a)[0xb61aa76a]
./libQtWebKit.so.4(+0x712beb)[0xb62b8beb]

這是 Google Earth 內建的 QtWebKit libraries 試著要載入 browser plugins,由於相容問題當掉了。有鑑於 Google Earth 內附得 Qt libraries 還造成其他的問題,像是中文選單變成方格等等。我們可以砍掉 Google 附贈的 Qt4,直接用系統內建的 Qt4 函式庫即可。

cd google-earth
for qtlib in libQtCore.so.4 libQtGui.so.4 libQtNetwork.so.4 libQtWebKit.so.4 ; do
    mv ${qtlib} ${qtlib}.moved.for.workaround
done

另外一個問題是 libIGGfx.so,它顯然用 (linked) 了 libfreeimage3,但是實際跑起來卻會造成問題。

Stacktrace from glibc:
/usr/lib/googleearth/libgoogleearth_free.so(+0xd090b)[0xb788290b]
[0xb78db400]
/usr/lib/googleearth/libIGGfx.so(+0x1296c9)[0xb3f206c9]
/usr/lib/googleearth/libIGGfx.so(FreeImage_LoadFromHandle+0xb1)[0xb3f0e2c1]
/usr/lib/googleearth/libIGGfx.so(_ZN3Gap3Gfx7igImage21platformLoadFreeImageEPNS_4Core6igFileEbPNS0_19igImageMetaDataListE+0xa1)[0xb3ef84b1]
/usr/lib/googleearth/libIGGfx.so(_ZN3Gap3Gfx10igOglImage12platformLoadEPNS_4Core6igFileEPNS0_19igImageMetaDataListE+0x112)[0xb3ef8bb2]
/usr/lib/googleearth/libIGGfx.so(_ZN3Gap3Gfx7igImage8loadFileEPNS_4Core6igFileEPNS0_19igImageMetaDataListE+0x12d)[0xb3ee91ad]
/usr/lib/googleearth/libevll.so(_ZN5earth4evll7Texture9LoadBytesEPKhi+0xa6d)[0xb0ad7b8d]
/usr/lib/googleearth/libevll.so(_ZN5earth4evll7Texture12ProcessWorkQEd+0x184)[0xb0ae3594]

解決方法是自己裝 libfreeimage3,然後用 LD_PRELOAD 換掉 Google Earth 包在 libIGGfx.so 中的函式。如下

LD_PRELOAD=/usr/lib/libfreeimage.so.3 googleearth

這樣你應該可以順利的啟動 Google Earth 5.2 了。

Debian/Ubuntu 版本

在 Debian 與 Ubuntu 上,Adnan Hodzic已經包裝了 googleearth-package,Debian 跟 Ubuntu 使用者只需要下達 make-googleearth-package 指令,系統就會自動下載 Google Earth,並包裝成 deb 檔案。再用 dpkg -i googleearth_*.deb 安裝即可。

目前的版本 (0.5.7) 還是用 Google Earth 預設的 Qt4 與 libfreeimage3。我提了一版修正,希望新版中可以預設刪除 Qt4 與 libfreeimage3,修正檔可於 #596423 取得。