--- title: OSX 10.11无法使用EasyConnect问题的排查与解决 tags: - 学习 - VPN - OSX categories: 学习 permalink: osx-easyconnect-problem featureImage: https://cat.yufan.me/cats/2015092101.jpg id: 142 updated: '2015-10-21 15:17:48' date: 2015-09-21 04:05:43 --- ## 前言 在苹果6月的开发者大会的洗脑下,小雨荣幸成为一名OSX10.11小白鼠。当时柏涛君信誓旦旦跟我说,如丝般顺滑流畅,我还真TM信了。随后便遇到了各种问题,什么JDK6无法安装,IDEA各种大姨妈,Fantastical无法使用。然而,最坑的问题是,我无法使用公司VPN,无法使用公司VPN,无法使用公司VPN。**因为很重要,所以要说三遍。** 才开始我以为和以前一样,是因为系统升级,需要重新安装,于是我重新下载安装客户端,没用。后面便有了各种折腾大法,什么浏览器安全等级大法,插件安全策略法,上网寻找最新的安装包更新法,无解…… 本着基本平常都在公司加班,回家也有舍友的电脑的想法,我暂时放弃了治疗。勘弁して!~~本想着因为用的是开发版,到了正式版应该能解决,然而,上周更新的GM版本(等价于正式版)让我彻底放弃,VPN君,就是连不上啊。QAQ 但是中秋和国庆,我好死不死地准备请假三天连休那么个十几天,しまった!我突然想起来,到时候回了家后家里可就只有我一台电脑,到时候出了什么事,那还得了!于是,我又一次踏上了解决VPN问题的不归路…… ## 排查 首先分析系统日志,一下子便看到如下内容: ```java 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` 来安装,结果如下: ```java 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.dylib` 的 `INSTALL_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` 下面。 然后我满怀期待登录VPN,Lucky,问题解决。 ## 总结 其实VPN登陆不上的问题只是一个小问题,一开始其实就应该有必要去查询系统日志,只有通过日志分析,才能知道原因。 其次,后面浏览 Cocoa 开发社区才知道,这种依赖调用的问题源于苹果修改了安全策略,阻止了原来的依赖调用,这才导致 EasyConnectPlugin 无法调用相关依赖。所以,遇到问题,还是要多思考,才能最终解决问题呀。 ## 后记 ほんと最近10時過ぎには眠くなるんだけど成長期か!!!?!?!?! 身長あと200000cmは欲しい, (#)‘ω‘(#) 最新的VPN插件出来了,此文作废,2333