在Solaris10 x86上编译openssl-fips

时间:2014-07-09 17:37:32

标签: unix openssl autotools solaris-10

我目前正在尝试在Solaris 10x86计算机上编译openssl-fips,而且在使用该库时我无法链接到fipscanister.o。这是我尝试链接时出现的问题:

{PWD}/dist/openssl/bin/../lib/fipscanister.o: wrong ELF class: ELFCLASS64

根据我在研究时收集的内容,问题是这样的:fipscanister.o被编译为64位二进制文​​件,它链接到32位库。我试过跟踪问题来编译openssl-fips。以下是我认为导致问题的命令:

./config fipscanisterbuild

这是输出的一部分我认为搞乱了它:

Configuring for solaris64-x86_64-gcc
    no-camellia     [default]  OPENSSL_NO_CAMELLIA (skip dir)
    no-gmp          [default]  OPENSSL_NO_GMP (skip dir)
    no-krb5         [krb5-flavor not specified] OPENSSL_NO_KRB5
    no-mdc2         [default]  OPENSSL_NO_MDC2 (skip dir)
    no-rc5          [default]  OPENSSL_NO_RC5 (skip dir)
    no-rfc3779      [default]  OPENSSL_NO_RFC3779 (skip dir)
    no-seed         [default]  OPENSSL_NO_SEED (skip dir)
    no-zlib         [default]
    no-zlib-dynamic [default]
IsMK1MF=0
CC            =gcc
CFLAG         =-fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN   
               -DHAVE_DLFCN_H -m64 -O3 -Wall -DL_ENDIAN -DMD32_REG_T=int
               -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM
EX_LIBS       =-lsocket -lnsl -ldl 
CPUID_OBJ     =x86_64cpuid.o
BN_ASM        =x86_64-gcc.o x86_64-mont.o
DES_ENC       =des_enc.o fcrypt_b.o
AES_ASM_OBJ   =aes-x86_64.o
BF_ENC        =bf_enc.o
CAST_ENC      =c_enc.o
RC4_ENC       =rc4-x86_64.o
RC5_ENC       =rc5_enc.o
MD5_OBJ_ASM   =md5-x86_64.o
SHA1_OBJ_ASM  =sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o
RMD160_OBJ_ASM=
PROCESSOR     =
RANLIB        =/usr/ccs/bin/ranlib
ARFLAGS       =
PERL          =/opt/csw/bin/perl
SIXTY_FOUR_BIT_LONG mode
DES_UNROLL used
DES_INT used
RC4_CHUNK is unsigned long
BF_PTR2 used
e_os2.h => include/openssl/e_os2.h

我在这里注意到几件事:

  1. fipscanisterbuild正在自动检测(错误地)我正在使用solaris64-x86_64。这是我的uname -a:

    SunOS hostname 5.10 Generic_147441-01 i86pc i386 i86pc
    
  2. CFLAG中包含-m64。这迫使fipscanister.o编译成64位二进制文​​件

  3. 最后它显示为SIXTY_FOUR_BIT_LONG模式

  4. 我试图用以下方法强制它编译为32位二进制文​​件:

    1. 我首先尝试使用env变量强制它使用-m32标志编译为32位二进制文​​件

      export CC="gcc -m32"
      
    2. 我还尝试使用命令

      使CFLAG使用我自己的env变量
      export CFLAG="gcc -m32"
      

      但无济于事。

    3. 我尝试通过更改命令

      使配置使用我的架构
      ./config fipscanisterbuild
      

      ./Configure solaris-x86-gcc
      

      它似乎有效,至少它将SIXTY_FOUR_BIT_LONG模式更改为THIRTY_TWO_BIT模式。但是当我编译并尝试链接到fipscanister.o时,我得到了相同的ELFCLASS64错误。

    4. 一个问题:

      为什么我的fipscanister选项在./config fipscanister中,当它是32位机器时,我的机器被识别为x86_64?

      我非常困难,所以如果有人能够解释这个令人困惑的问题,那就太棒了。

3 个答案:

答案 0 :(得分:1)

<{3}}上的Henry Unger分享了以下内容:

  

使用32位或64位Solaris 10构建32位OpenSSL库   gcc,我们这样做:

export MACHINE=x86
export CC='gcc -m32'

导出CCMACHINE后,请运行config

答案 1 :(得分:1)

好的,所以我修好了我认为

以前我使用的是这个命令:

./config fipscanisterbuild

我也试过这个命令

./Configure solaris-x86-gcc

我可以使用此命令强制configure使用正确的依赖项创建32位二进制文​​件:

./Configure solaris-x86-gcc fipscanisterbuild

与jww所说的相似,此命令强制配置将计算机识别为在gcc上编译的solaris-x86机器。不同之处在于我不会离开Configure来决定机器的架构,并添加一个标志来向编译器展示我想要的东西,而不是让我使用solaris-x86-gcc。

答案 2 :(得分:1)

在更多旋钮转动环境变量之后,我能够使用 32位模式(solaris-whatever-gcc)获得三元组THIRTY_TWO_BIT mode

我不确定它的预期,它看起来更像是OpenSSL配置系统中的一个错误(特别是SYSTEM="gcc"部分)。

您仍可能需要CC=gcc -m32技巧。

export KERNEL_BITS=32
export ARCH=x86

export MACHINE="solaris"
export RELAEASE="10"
export SYSTEM="gcc"
export BUILD="Solaris; Solaris 10; x86"

openssl-fips-2.0.5$ ./config 
Operating system: solaris-whatever-gcc
Auto Configuring fipsonly
Auto Configuring fipsonly
Configuring for gcc
Auto Configuring fipsonly
Configuring for gcc
    no-bf           [option]   OPENSSL_NO_BF (skip dir)
    no-camellia     [option]   OPENSSL_NO_CAMELLIA (skip dir)
    no-cast         [option]   OPENSSL_NO_CAST (skip dir)
    no-ec_nistp_64_gcc_128 [default]  OPENSSL_NO_EC_NISTP_64_GCC_128 (skip dir)
    no-gmp          [default]  OPENSSL_NO_GMP (skip dir)
    no-idea         [option]   OPENSSL_NO_IDEA (skip dir)
    no-jpake        [experimental] OPENSSL_NO_JPAKE (skip dir)
    no-krb5         [krb5-flavor not specified] OPENSSL_NO_KRB5
    no-md2          [option]   OPENSSL_NO_MD2 (skip dir)
    no-md5          [option]   OPENSSL_NO_MD5 (skip dir)
    no-mdc2         [option]   OPENSSL_NO_MDC2 (skip dir)
    no-rc2          [option]   OPENSSL_NO_RC2 (skip dir)
    no-rc4          [option]   OPENSSL_NO_RC4 (skip dir)
    no-rc5          [option]   OPENSSL_NO_RC5 (skip dir)
    no-rfc3779      [default]  OPENSSL_NO_RFC3779 (skip dir)
    no-ripemd       [option]   OPENSSL_NO_RIPEMD (skip dir)
    no-seed         [option]   OPENSSL_NO_SEED (skip dir)
    no-srp          [forced]   OPENSSL_NO_SRP (skip dir)
    no-ssl2         [forced]   OPENSSL_NO_SSL2 (skip dir)
    no-ssl3         [forced]   OPENSSL_NO_SSL3 (skip dir)
    no-store        [experimental] OPENSSL_NO_STORE (skip dir)
    no-tls1         [forced]   OPENSSL_NO_TLS1 (skip dir)
    no-tlsext       [forced]   OPENSSL_NO_TLSEXT (skip dir)
    no-zlib         [default] 
    no-zlib-dynamic [default] 
IsMK1MF=0
CC            =gcc
CFLAG         =-DOPENSSL_FIPSCANISTER -O3
EX_LIBS       =
CPUID_OBJ     =mem_clr.o
BN_ASM        =bn_asm.o
DES_ENC       =des_enc.o fcrypt_b.o
AES_ENC       =aes_core.o aes_cbc.o
BF_ENC        =bf_enc.o
CAST_ENC      =c_enc.o
RC4_ENC       =rc4_enc.o rc4_skey.o
RC5_ENC       =rc5_enc.o
MD5_OBJ_ASM   =
SHA1_OBJ_ASM  =
RMD160_OBJ_ASM=
CMLL_ENC      =camellia.o cmll_misc.o cmll_cbc.o
MODES_OBJ     =
ENGINES_OBJ   =
PROCESSOR     =
RANLIB        =/usr/bin/ranlib
ARFLAGS       =
PERL          =/opt/local/bin/perl5
THIRTY_TWO_BIT mode
BN_LLONG mode
RC4_CHUNK is undefined
...