yufan.me/source/_posts/2015-09-21.md
2024-06-14 02:15:18 +08:00

6.0 KiB
Raw Blame History

title tags categories permalink featureImage id updated date
OSX 10.11无法使用EasyConnect问题的排查与解决
学习
VPN
OSX
学习 osx-easyconnect-problem https://cat.yufan.me/cats/2015092101.jpg 142 2015-10-21 15:17:48 2015-09-21 04:05:43

前言

在苹果6月的开发者大会的洗脑下小雨荣幸成为一名OSX10.11小白鼠。当时柏涛君信誓旦旦跟我说如丝般顺滑流畅我还真TM信了。随后便遇到了各种问题什么JDK6无法安装IDEA各种大姨妈Fantastical无法使用。然而最坑的问题是我无法使用公司VPN无法使用公司VPN无法使用公司VPN。因为很重要,所以要说三遍。

才开始我以为和以前一样,是因为系统升级,需要重新安装,于是我重新下载安装客户端,没用。后面便有了各种折腾大法,什么浏览器安全等级大法,插件安全策略法,上网寻找最新的安装包更新法,无解……

本着基本平常都在公司加班回家也有舍友的电脑的想法我暂时放弃了治疗。勘弁して本想着因为用的是开发版到了正式版应该能解决然而上周更新的GM版本等价于正式版让我彻底放弃VPN君就是连不上啊。QAQ

但是中秋和国庆我好死不死地准备请假三天连休那么个十几天しまった我突然想起来到时候回了家后家里可就只有我一台电脑到时候出了什么事那还得了于是我又一次踏上了解决VPN问题的不归路……

排查

首先分析系统日志,一下子便看到如下内容:

15/9/21 上午3:04:36.990 com.apple.WebKit.Plugin.64[13691]: Error loading /Library/Internet Plug-Ins/EasyConnectPlugin.plugin/Contents/MacOS/EasyConnectPlugin:  dlopen(/Library/Internet Plug-Ins/EasyConnectPlugin.plugin/Contents/MacOS/EasyConnectPlugin, 262): Library not loaded: @loader_path/libCMS.dylib
  Referenced from: /Library/Internet Plug-Ins/EasyConnectPlugin.plugin/Contents/MacOS/EasyConnectPlugin
  Reason: image not found

基本上都是出现此报错然后VPN连接失败。

于是谷歌 libCMS.dylib 到底是个什么东东,为何会找不到。但完全无解,所有搜索 libCMS.dylib 的内容都指向一个 liblcms.dylib 的库。

这到底是个什么牛逼哄哄的库谷歌都找不到抱着怀疑的心态本地搜索此文件一发Lucky还真给我找到了^O^

/Applications/EasyConnect.app/Contents/Resources/Libs 下发现此文件。那么问题好办了,只要把库文件放在正确的位置让程序启动时能找到就行了。

于是使用命令行工具 otool 分析程序,otool 需要 xcode-select --install 来安装,结果如下:

otool -L /Applications/EasyConnect.app/Contents/MacOS/EasyConnect
/Applications/EasyConnect.app/Contents/MacOS/EasyConnect:
    /usr/local/lib/libTevent.dylib (compatibility version 1.0.0, current version 1.0.0)
    @loader_path/libCMS.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/local/lib/libecbase.dylib (compatibility version 7.0.0, current version 7.0.0)
    /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration (compatibility version 1.0.0, current version 453.19.0)
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 19.0.0)
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 945.16.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
    /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 57.0.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 744.18.0)
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1187.37.0)

可以看到 libCMS.dylib 的依赖路径是 @loader_path Google此变量的意思得到如下解释

@loader_path

这个变量表示每一个被加载的 binary (包括可执行程序, dylib, framework 等) 所在的目录。在一个进程中,对于每一个模块,@loader_path 会解析成不用的路径。而 @executable_path 总是被解析为同一个路径(可执行程序所在目录)。比如一个会被多个程序调用的 plugin位于 /path/Myfilter.plugin/Contents/MacOS/Myfilter,依赖 /path/Myfilter.plugin/Contents/dylib/libfoo.dylib

那么 libfoo.dylibINSTALL_PATH 可以设置为 @loader_path/../dylib,这样设置的话,不论 Myfilter.plugin 目录放到什么位置,libfoo.dylib 都能正确的被加载。

因为 @loader_path 的依赖路径由程序编译时指定,我们无法修改,但是我们可以将依赖拷贝至能调用到的地方。

libCMS.dylib 拷贝至 /Library/Internet Plug-Ins/EasyConnectPlugin.plugin/Contents/MacOS/EasyConnectPlugin/Applications/EasyConnect.app/Contents/MacOS/EasyConnect 下面。

然后我满怀期待登录VPNLucky问题解决。

总结

其实VPN登陆不上的问题只是一个小问题一开始其实就应该有必要去查询系统日志只有通过日志分析才能知道原因。

其次,后面浏览 Cocoa 开发社区才知道,这种依赖调用的问题源于苹果修改了安全策略,阻止了原来的依赖调用,这才导致 EasyConnectPlugin 无法调用相关依赖。所以,遇到问题,还是要多思考,才能最终解决问题呀。

后记

ほんと最近10時過ぎには眠くなるんだけど成長期か

身長あと200000cmは欲しい (#)‘ω‘(#)

最新的VPN插件出来了此文作废2333