如何使用特定版本的zlib在ubuntu上构建openssl?

时间:2013-05-17 05:17:07

标签: c++ openssl zlib

背景

我想针对特定版本的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成功构建。

问题

我检查哪个版本的zlib与命令ldd libssl.so链接。

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版本。如果我将自己的版本libz.so.1复制到libssl'lib'目录中,然后在同一目录中运行ldd,结果是相同的。

问题

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

环境

uBuntu 13.04 x64 与GCC一起编译 用Make构建

2 个答案:

答案 0 :(得分:4)

答案结果是,您需要使用类似于以下语法设置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 <library>返回的内容上,只需担心ldd -r <executable>

答案 1 :(得分:-2)

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