背景
我想针对特定版本的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构建
答案 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