4

背景

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

问题

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

环境

uBuntu 13.04 x64 编译与 GCC 构建与 Make

4

2 回答 2

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>

于 2013-05-20T02:47:06.150 回答
-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

于 2016-04-14T06:47:35.133 回答