我們有一個項目需要在iOS設備上運行openssl引擎。我們已經爲測試引擎編譯了.so文件,並且它可以在命令行下正常工作。但是,當我們將其放入iOS項目並嘗試加載引擎時,加載步驟始終會出現錯誤。未裝載用於iOS的Openssl引擎
NSString *enginePath = [[NSBundle mainBundle] pathForResource:@"silly-engine" ofType:@"so"];
char* engine_id = "silly-engine";
char* engine_path = (char *)[enginePath UTF8String];
ENGINE_load_dynamic();
ENGINE *dyn = ENGINE_by_id("dynamic");
if (!ENGINE_ctrl_cmd_string(dyn, "SO_PATH", engine_path, 0))
{
NSLog(@"SO_PATH failed");
}
if (!ENGINE_ctrl_cmd_string(dyn, "DIR_ADD", engine_path, 0))
{
NSLog(@"DIR_ADD failed");
}
if (!ENGINE_ctrl_cmd_string(dyn, "ID", engine_id, 0))
{
NSLog(@"ID failed");
}
if (!ENGINE_ctrl_cmd(dyn, "LIST_ADD", 1, NULL, NULL, 0))
{
NSLog(@"LIST_ADD failed");
}
if (!ENGINE_ctrl_cmd_string(dyn, "LOAD", NULL, 0))
{
NSLog(@"LOAD failed");
}
ENGINE *myEngine = ENGINE_by_id(engine_id);
myEngine
將永遠是NULL
。我懷疑iOS不允許這樣的動態庫。有沒有人有經驗如何使OpenSSL引擎在iOS上工作?
大多數iOS版本都不允許動態加載庫。我被告知最近改變了。但是,你可以通過「swizzling」來解決它。請參見[使用動態庫的Objective C方法Swizzling](http://stackoverflow.com/q/9638815)。另請參閱[重新思考和重新包裝iOS應用程序](https://www.google.com/search?q=Rethinking+%26+Repackaging+iOS+Apps)。 – jww
@jww感謝您的信息。使用動態庫進行Swizzling是另一種嘗試的方法。然而,在挖掘之後,我被告知Apple不允許在iOS中定製動態庫(將被App Store拒絕)。所以另一個問題是,我們可以在編譯OpenSSL時修改'openssl.cnf'來添加我們的庫,然後將它作爲默認引擎提供嗎? – Summer