在 AIX 上编译 OpenSSH (PKIXSSH) 时无法与 OpenSSL 加密库链接
Posted
技术标签:
【中文标题】在 AIX 上编译 OpenSSH (PKIXSSH) 时无法与 OpenSSL 加密库链接【英文标题】:Cannot link with OpenSSL crypto library when compiling OpenSSH (PKIXSSH) on AIX 【发布时间】:2020-05-13 03:43:55 【问题描述】:我正在尝试使用 OpenSSL 的编译版本在 AIX 上编译 pkixssh(OpenSSH 的一个分支),但没有成功。
配置阶段显示的错误如下:
checking how to link programs using OpenSSL functions... fail
configure: error: cannot link with OpenSSL crypto library
OpenSSH 1.1.1d 已经成功编译在 /soft/openssh-8.1 下,所以库在 /soft/openssh-8.1/lib 下
$ ls /soft/openssh-8.1/lib
engines-1.1 libcrypto.so libcrypto64.so.1.1 libssl.a libssl.so.1 libssl_a.a
libcrypto.a libcrypto.so.1 libcrypto_a.a libssl.so libssl64.so.1.1 pkgconfig
并且正确地找到了 openssl 二进制文件,例如:
$ ldd /soft/openssh-8.1/bin/openssl
/soft/openssh-8.1/bin/openssl needs:
/soft/openssh-8.1/lib/libssl.a(libssl64.so.1.1)
/soft/openssh-8.1/lib/libcrypto.a(libcrypto64.so.1.1)
/opt/freeware/lib/libz.so
/usr/ccs/lib/libpthreads.a(shr_xpg5_64.o)
/usr/ccs/lib/libc.a(shr_64.o)
/unix
/soft/openssh-8.1/lib/libcrypt.a(shr_64.o)
我用不同的 LDFLAGS 组合进行了测试,但没有成功。
Powerpc 上的 AIX 版本是 7.1 GCC 版本是 4.6.1
配置OpenSSH编译的configure命令如下:
./configure --prefix=/soft/openssh-8.1/ \
--sbindir=/soft/openssh-8.1/bin \
--sysconfdir=/soft/openssh-8.1/data \
--datadir=/soft/openssh-8.1/data \
--with-pid-dir=/soft/openssh-8.1/data \
--without-stackprotect \
--with-pam \
--with-md5-passwords \
--with-ssl-dir=/soft/openssh-8.1 \
--with-privsep-path=/var/empty/sshd
有什么想法吗?
【问题讨论】:
现在您尝试编译的是 openssh-8.1 还是 pkixssh-12.3?如果是后者,您是否使用了 configure-option--with-ssl-dir=/soft/openssh-8.1/
?
嗨!它是 pkixssh-12.3。我们已经在使用该选项。我们几乎完成了编译。总之我会回答我自己的问题:-)
【参考方案1】:
在 AIX 上编译的关键是使用变量 LIBPATH,相当于 Linux 上的 LD_LIBRARY_PATH。
在这种情况下,特别是变量 blibpath 也被设置,在配置脚本中用于将自定义库路径作为选项传递给编译器,并将此路径设置为库中的库搜索路径二进制文件。
为确保在编译中使用 64 位二进制文件,请在配置命令之前设置以下变量:
OPENSSH_PATH="/soft/openssh-8.1"
export PATH="/soft/perl-5.16.3/bin:$OPENSSH_PATH/bin:$PATH"
# Library path in linking time
export blibpath="$OPENSSH_PATH/lib:/opt/freeware/lib64:/usr/lib:/lib"
# Library path in run time
export LIBPATH="$OPENSSH_PATH/lib:/opt/freeware/lib64:/opt/freeware/lib:/opt/lib64:/opt/64/lib:/opt/lib:/usr/lib64:/usr/lib:/lib:/usr/ccs/lib/"
export CFLAGS="-g -O2"
export CC="gcc -maix64"
export OBJECT_MODE=64
export NM="nm -X64"
export AR="ar -X64"
如上所述,要设置的两个主要变量是编译阶段使用的 blibpath 和运行二进制文件时使用的 LIBPATH。
结果二进制文件的库设置正确:-)
$ ldd /soft/openssh-8.1/bin/sshd
/soft/openssh-8.1/bin/sshd needs:
/usr/lib/libc.a(shr_64.o)
/soft/openssh-8.1/lib/libcrypto.a(libcrypto64.so.1.1)
/soft/openssh-8.1/lib/libssl.a(libssl64.so.1.1)
/usr/lib/libz.a(libz.so.1)
/usr/lib/libpam.a(shr_64.o)
/unix
/usr/lib/libcrypt.a(shr_64.o)
/opt/freeware/lib64/libz.so
/usr/lib/libpthreads.a(shr_xpg5_64.o)
/usr/lib/libmls.a(shr_64.o)
/usr/lib/libmlsenc.a(shr_64.o)
/usr/lib/libodm.a(shr_64.o)
$ dump -X64 -Hv /soft/openssh-8.1/bin/sshd
/soft/openssh-8.1/bin/sshd:
***Loader Section***
Loader Header Information
VERSION# #SYMtableENT #RELOCent LENidSTR
0x00000001 0x00000247 0x00000734 0x000000aa
#IMPfilID OFFidSTR LENstrTBL OFFstrTBL
0x00000006 0x0000aa20 0x0000238a 0x0000aaca
***Import File Strings***
INDEX PATH BASE MEMBER
0 /soft/openssh-8.1/lib:/opt/freeware/lib64:/usr/lib:/lib
1 libc.a shr_64.o
2 libcrypto.a libcrypto64.so.1.1
3 libssl.a libssl64.so.1.1
4 libz.a libz.so.1
5 libpam.a shr_64.o
$ ldd /soft/openssh-8.1/libexec/sftp-server
/soft/openssh-8.1/libexec/sftp-server needs:
/usr/lib/libc.a(shr_64.o)
/soft/openssh-8.1/lib/libcrypto.a(libcrypto64.so.1.1)
/unix
/usr/lib/libcrypt.a(shr_64.o)
/opt/freeware/lib64/libz.so
/usr/lib/libpthreads.a(shr_xpg5_64.o)
$ dump -X64 -Hv /soft/openssh-8.1/libexec/sftp-server
/soft/openssh-8.1/libexec/sftp-server:
***Loader Section***
Loader Header Information
VERSION# #SYMtableENT #RELOCent LENidSTR
0x00000001 0x00000081 0x0000016b 0x0000006b
#IMPfilID OFFidSTR LENstrTBL OFFstrTBL
0x00000003 0x00002300 0x00000552 0x0000236b
***Import File Strings***
INDEX PATH BASE MEMBER
0 /soft/openssh-8.1/lib:/opt/freeware/lib64:/usr/lib:/lib
1 libc.a shr_64.o
2 libcrypto.a libcrypto64.so.1.1
ldd
命令说明使用了哪些库,dump -X64 -Hv
说明了这些库将在哪些路径中使用。
【讨论】:
一篇关于 AIX 编译说明的好帖子位于 hpc.cineca.it/content/tips-linking-libraries-ibm-sp6-aix以上是关于在 AIX 上编译 OpenSSH (PKIXSSH) 时无法与 OpenSSL 加密库链接的主要内容,如果未能解决你的问题,请参考以下文章
使用 g++ 在 AIX 上编译 pthread.h 的东西