修改OpenSSL默認編譯出的動態庫文件名稱


    在 Windows 平台上調用動態鏈接庫 dll 文件時,有兩種方式:
a) 隱式的加載時鏈接;使用 *.lib (導入庫)文件,在 IDE 的鏈接器相關設置中加入導入庫 lib 文件的名稱,或在程序中加入預編譯指令 #pragma comment (lib,”*.lib”)。
b) 顯式的運行時鏈接。不使用 *.lib (導入庫)文件,使用 Load Library(),GetProcAddress() 函數來加載動態庫中的函數。
要注意的是在導入庫 lib 文件內部包含了其對應 dll 文件的名稱,如果使用 16 進制編輯器(如 WinHex)打開導入庫的 lib 文件,可以看到對應的 dll 文件名。

    在 Windows 平台上,用微軟 Visual Studio 中的 C 編譯器生成 OpenSSL 的動態庫,產生的文件在 out32dll 目錄下,有四個文件,默認名稱分別為:libeay32.lib,libeay32.dll,ssleay32.lib,ssleay32.dll。這里以 lib 為后綴的是同名 dll 對應的導入庫文件,不是靜態庫文件。
    即使編譯出的庫文件是 64 位的,默認文件名也是如此,如果我們希望生成的庫文件取其他名稱,比如希望64位的庫文件名稱依次為:libeay_x64.lib,libeay_x64.dll,ssleay_x64.lib,ssleay_x64.dll,直接修改文件名稱僅在顯式的運行時鏈接動態庫時可行,但如果使用隱式的加載時鏈接方式加載動態庫,只簡單改名是不行的。此時如果只簡單改名,在編譯時可以通過,但是在運行時,盡管在可執行目錄下已經存在libeay_x64.dll或ssleay_x64.dll,還是會報告錯誤:
“無法啟動此程序,因為計算機中丟失 libeay32.dll(或 ssleay32.dll)。嘗試重新安裝該程序以解決此問題。”

    說明運行時還是要去找改名前的文件,而不會去找改名后的文件。原因在就於雖然已將導入庫 libeay32.lib,ssleay32.lib 的名字修改為 libeay_x64.lib,ssleay_x64.lib,但是在這兩個文件的內部對應 dll 文件名還是 libeay32.dll 和 ssleay32.dll。如果用16進制編輯器打開這兩個導入庫文件,能夠看到其內部還存在很多ASCII碼值為libeay32.dll,ssleay32.dll的字符串。

    要想修改 OpenSSL 默認編譯出的動態庫文件名稱,必須在編譯動態庫時執行一些特殊的操作。對於編譯 OpenSSL,可以參考http://blog.csdn.net/henter/article/details/8364532,下面主要介紹如何改變編譯出的動態庫文件名。
1)假定希望編譯出的 32 位 OpenSSL 動態庫文件名稱分別為 libeay_x86.lib,libeay_x86.dll,ssleay_x86.lib,ssleay_x86.dll,操作如下:

1.1) 在 OpenSSL 的源代碼所在目錄下,用文本編輯器(比如 Notepad++)打開 Configure 文件,搜索字符串 libeay32(不區分大小寫),大概位置在第 1978、1979 行,可以找到如下內容:
#if defined(CRYPTO)
     VALUE "InternalName", "libeay32\\0"
     VALUE "OriginalFilename", "libeay32.dll\\0"
將其中所有的 libeay32 字符串替換為 libeay_x86

緊隨其后的行中有如下內容:
#elif defined(SSL)
     VALUE "InternalName", "ssleay32\\0"
     VALUE "OriginalFilename", "ssleay32.dll\\0"
將其中所有的ssleay32字符串替換為 ssleay_x86

1.2)執行命令
perl Configure VC-WIN32 no-asm
ms\do_ms

1.3)進入 ms 目錄,用文本編輯器修改文件 libeay32.def,找到下面的行:
LIBRARY         LIBEAY32
將這一行改為:
LIBRARY         LIBEAY_X86

用文本編輯器修改文件 ssleay32.def,找到下面的行:
LIBRARY         SSLEAY32
將這一行改為:
LIBRARY         SSLEAY_X86

用文本編輯器修改文件 ntdll.mak,找到下面三行:
E_EXE=openssl
SSL=ssleay32
CRYPTO=libeay32
修改為:
E_EXE=openssl
SSL=ssleay_x86
CRYPTO=libeay_x86
注意第一行不用修改,改的是第二、第三行。

1.4)執行命令
nmake -f ms\ntdll.mak
這樣生成的動態庫文件名就是期望的名字,不是OpenSSL 默認的文件名。

-----------------------------------------------------------------------------
2)如果希望編譯出的 64 位 OpenSSL 動態庫文件名稱分別為 libeay_x64.lib,libeay_x64.dll,ssleay_x64.lib,ssleay_x64.dll,操作如下:

2.1)在 OpenSSL 的源代碼所在目錄下,用文本編輯器打開 Configure 文件,搜索字符串 libeay32(不區分大小寫),大概位置在第 1978、1979 行找到如下內容:
#if defined(CRYPTO)
     VALUE "InternalName", "libeay32\\0"
     VALUE "OriginalFilename", "libeay32.dll\\0"
將其中所有的libeay32字符串替換為libeay_x64

緊隨其后的行中有如下內容:
#elif defined(SSL)
     VALUE "InternalName", "ssleay32\\0"
     VALUE "OriginalFilename", "ssleay32.dll\\0"
將其中所有的ssleay32字符串替換為ssleay_x64

2.2)執行命令
perl Configure VC-WIN64A
ms\do_win64a

2.3)進入 ms 目錄,用文本編輯器修改文件 libeay32.def,找到下面的行:
LIBRARY         LIBEAY32
將這一行改為:
LIBRARY         LIBEAY_X64

用文本編輯器修改文件 ssleay32.def,找到下面的行:
LIBRARY         SSLEAY32
將這一行改為:
LIBRARY         SSLEAY_X64

用文本編輯器修改文件 ntdll.mak,找到下面三行:
E_EXE=openssl
SSL=ssleay32
CRYPTO=libeay32
修改為:
E_EXE=openssl
SSL=ssleay_x64
CRYPTO=libeay_x64
注意第一行不用修改,改的是第二、第三行。

2.4)執行命令
nmake -f ms\ntdll.mak
這樣生成的動態庫文件名就是期望的名字,不是OpenSSL 默認的文件名。

-----------------------------------------------------------------------------
    在 64 位 Win7 上編譯,使用 Visual Studio 2010,執行命令 nmake -f ms\ntdll.mak 時不管是編譯 32 位庫文件還是 64 位庫文件,都曾遇到如下錯誤:
LINK : fatal error LNK1123: 轉換到 COFF 期間失敗: 文件無效或損壞

解決方法是:
    在計算機中搜索 cvtres.exe 文件,在目錄 \Windows\Microsoft.NET\Framework 和 \Microsoft Visual Studio 10.0\VC 下都能找到32位的文件cvtres.exe,發現 \Microsoft Visual Studio 10.0\VC 下文件版本較老,將其改名或刪除。
    在目錄 \Windows\Microsoft.NET\Framework64 和 \Microsoft Visual Studio 10.0\VC\bin 下都能找到64位的文件cvtres.exe,發現 \Microsoft Visual Studio 10.0\VC\bin 下文件版本較老,將其改名或刪除。
    之后執行 nmake -f ms\ntdll.mak 時就不會報告“轉換到 COFF 期間失敗: 文件無效或損壞”的錯誤了。

http://blog.csdn.net/henter/article/details/39576419


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM