zoukankan      html  css  js  c++  java
  • 修改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
    msdo_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 tdll.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
    msdo_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 tdll.mak
    这样生成的动态库文件名就是期望的名字,不是OpenSSL 默认的文件名。

    -----------------------------------------------------------------------------
        在 64 位 Win7 上编译,使用 Visual Studio 2010,执行命令 nmake -f ms tdll.mak 时不管是编译 32 位库文件还是 64 位库文件,都曾遇到如下错误:
    LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    解决方法是:
        在计算机中搜索 cvtres.exe 文件,在目录 WindowsMicrosoft.NETFramework 和 Microsoft Visual Studio 10.0VC 下都能找到32位的文件cvtres.exe,发现 Microsoft Visual Studio 10.0VC 下文件版本较老,将其改名或删除。
        在目录 WindowsMicrosoft.NETFramework64 和 Microsoft Visual Studio 10.0VCin 下都能找到64位的文件cvtres.exe,发现 Microsoft Visual Studio 10.0VCin 下文件版本较老,将其改名或删除。
        之后执行 nmake -f ms tdll.mak 时就不会报告“转换到 COFF 期间失败: 文件无效或损坏”的错误了。

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

  • 相关阅读:
    angular学习地址
    ab压力测试-突破最大线程数
    apache-ab并发负载压力测试 不错
    yum: Cannot find a valid baseurl for repo: migsrv解决方法
    Error: rpmdb open failed
    Web性能压力测试之Webbench使用详解
    几款Web服务器性能压力测试工具
    利用http_load测试Web引擎性能
    gunicorn部署Flask服务
    Python Web 框架:Tornado
  • 原文地址:https://www.cnblogs.com/findumars/p/5459826.html
Copyright © 2011-2022 走看看