91 lines
6.0 KiB
Markdown
91 lines
6.0 KiB
Markdown
---
|
||
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。**因为很重要,所以要说三遍。**
|
||
|
||
才开始我以为和以前一样,是因为系统升级,需要重新安装,于是我重新下载安装客户端,没用。后面便有了各种折腾大法,什么浏览器安全等级大法,插件安全策略法,上网寻找最新的安装包更新法,无解……
|
||
|
||
<!--more-->
|
||
|
||
本着基本平常都在公司加班,回家也有舍友的电脑的想法,我暂时放弃了治疗。勘弁して!~~本想着因为用的是开发版,到了正式版应该能解决,然而,上周更新的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
|