回覆列表
  • 1 # 使用者5253322899700

    事情的起因是這樣的, 因為某些原因, 最近在寫 Nodejs 的 c++ module, 然後在js這邊呼叫。 網路通訊自然離不開ssl, 於是需要連結到Openssl的庫。 我們本來的期望是,需要使用者安裝有Openssl的執行庫, 然後我們的c++ module 動態連結到Openssl的so庫上來執行。 起初一切看起來還不錯,直到我們發現這個openssl的函式不能工作: PKCS7_sign() PKCS7_sign ( ) 我們發現: 如果我們的 c++ 模組與Openssl庫動態連結的話, 編譯都沒問題. 但是執行會出現: PKCS7_sign 符號無法找到的錯誤. 如果我們的 c++ 模組與Openssl庫靜態連結的話, 編譯也沒問題, 但是執行時,呼叫這個函式的地方沒有效果, 這個函式返回值是 0. 按照文件表示出現錯誤, 但是用 Openssl的函式 ERR_get_error 獲取錯誤碼也是0. 表示沒有錯誤碼. 在linux上是這樣, 那在Mac上呢? 用Mac試了一下, 發現Mac沒有問題. 於是,想到這可能是Nodejs的一個bug. 然後就去 Nodejs 給它報了一個bug: [https://github.com/joyent/node/issues/8026][1] 同時, google上搜索了 nodejs linking to openssl 類似的關鍵字. 找到這樣幾篇文章:

    https://github.com/TooTallNate/node-gyp/wiki/Linking-OpenSSL

    https://github.com/joyent/node/issues/3915

    http://serverfault.com/questions/338092/how-can-i-build-node-js-using-static-libssl-and-crypto-libraries

    https://github.com/robhawkes/node-extension/issues/1

    透過搜尋, 我們發現, 原來Nodejs自己也使用了Openssl 庫, 推測nodejs自己的crypto模組也是使用Openssl lib實現的. 這點從Nodejs的原始碼中就能發現, 它包含了最新的Openssl的全部原始碼. 其中寫上面第一篇文章:

    https://github.com/TooTallNate/node-gyp/wiki/Linking-to-OpenSSL

    的那個帥哥是Nodejs的開發人員. 基本結論: Nodejs 自己使用了Openssl 在Nodejs 0.6之前, Nodejs是動態連結到 Openssl 庫的. 而之後的版本都是靜態連結的. 這時發現 Node 那邊已經回覆我的bug了:

    https://github.com/joyent/node/issues/8026

    Node 解釋的原因: Node 自己編譯之後, 把自己沒用到的符號清除, 所以我們在執行時就找不到符號了. 於是他們把這bug 修掉了. 保留了全部符號. 這導致 Node 的體積大了 400k.

  • 中秋節和大豐收的關聯?
  • 做月子期間的人可以吃麵條嗎?