在 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 的东西

使用xlC 13.1.2在AIX 7.1上编译boost C ++库

AIX 6.1 链接器错误

在 AIX 7.1 上从源代码编译 Ruby

aix 怎么安装openssh-6.6p1

aix升级openssh报错找不到安装包