【问题标题】:How can one build openssl on ubuntu with a specific version of zlib?如何使用特定版本的 zlib 在 ubuntu 上构建 openssl?
【发布时间】:2013-05-17 05:17:06
【问题描述】:

背景

我想针对特定版本的 zlib 构建 OpenSSL,以便我的所有代码都由我构建。我对我使用的许多库都这样做,这样我就不会在不同版本的操作系统上得到不同的行为。我知道这不是绝对必要的,但我想要。

我做了什么

我在 ~/zlib/zlib-1.2.7 中构建了 zlib,并将 zlib 安装到 ~/zlib/lib 和 ~/zlib/include。

(请注意,我已通过将我的工作目录替换为“~”来简化这篇文章中的所有路径)

我已经构建了 openssl,将这些参数传递给 ./config

--with-zlib-lib=~/zlib/lib
--with-zlib-include=~/zlib/include

当我构建 openssl 时,我可以看到适当的 -I 参数正在传递给 GCC

./config --prefix=~/openssl --openssldir=openssl/ssl threads zlib-dynamic shared --with-zlib-lib=~/zlib/lib --with-zlib-include=~/zlib/include && make && make install
. . .
...many lines of output...
. . .
gcc -I.. -I../.. -I../modes -I../asn1 -I../evp -I../../include -I/home/ubuntu/zlib/include -fPIC -DOPENSSL_PIC -DZLIB_SHARED -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -m64 -DL_ENDIAN -DTERMIO -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM   -c -o cm_pmeth.o cm_pmeth.c

OpenSSL 构建成功。

问题

我通过ldd libssl.so 命令查看正在链接的zlib 版本。

ubuntu@lemming012:~/ben/code/optimiser/libs/3rdParty/openssl/lib$ ldd libssl.so
        linux-vdso.so.1 =>  (0x00007fff3e7ff000)
        libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f289bcab000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f289baa6000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f289b88f000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f289c6c7000)

我希望看到 ldd 在列表中报告我自己的 libz 文件。

相反,ldd 报告 libssl 链接到我系统安装的 libz 版本。如果我在同一目录中运行 ldd 之前将自己的版本 libz.so.1 复制到 libssl 'lib' 目录中,结果是相同的。

问题

我做错了什么?如何让 OpenSSL 链接到 my 版本的 zlib 而不是系统上安装的版本?

环境

uBuntu 13.04 x64 用 GCC 编译 使用 Make 构建

【问题讨论】:

    标签: c++ openssl zlib


    【解决方案1】:

    答案是,你需要设置一个rpath,其语法类似于以下。我在 Makefile 中做我的,这就是双 '$' 的原因。

    LDFLAGS    += -Wl,-rpath,'$$ORIGIN/../lib'
    

    现在,我不一定需要在库 (openssl) 本身上执行此操作。我可以在调用可执行文件上执行此操作。如果库没有 rpath,则接下来使用可执行文件上的 rpath。简而言之,我不需要强调ldd -r <library> 返回的路径错误,只要ldd -r <executable> 返回正确的路径即可。

    我可以使用以下命令按库进行测试:

    env LD_LIBRARY_PATH=$PWD ldd -r <library>
    

    一旦我的可执行文件被编译,我可以像这样验证一切:

    ldd -r <executable>
    

    长话短说,一切正常,不要挂断ldd -r &lt;library&gt; 正在返回的内容,只需担心ldd -r &lt;executable&gt;

    【讨论】:

      【解决方案2】:

      ./config --prefix=/data/services/openssl-1.0.2g 共享zlib -I/data/services/zlib-1.2.7/include -L/data/services/zlib-1.2.7/lib

      【讨论】:

      • 您能否在答案中添加一些描述性信息?我们在看什么?
      • -I like CPPFLAGS , -L like LDFLAGS , and /data/services/zlib-1.2.7/ is ths specific version of zlib install directory.above config command can build openssl with specific version of zlib .请阅读openssl安装wiki:link
      猜你喜欢
      • 2016-12-23
      • 2014-08-15
      • 1970-01-01
      • 2015-02-10
      • 2011-03-10
      • 2017-09-26
      • 2023-03-08
      • 2018-08-31
      相关资源
      最近更新 更多