我目前正在尝试在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
我在这里注意到几件事:
fipscanisterbuild正在自动检测(错误地)我正在使用solaris64-x86_64。这是我的uname -a:
SunOS hostname 5.10 Generic_147441-01 i86pc i386 i86pc
CFLAG中包含-m64。这迫使fipscanister.o编译成64位二进制文件
最后它显示为SIXTY_FOUR_BIT_LONG模式
我试图用以下方法强制它编译为32位二进制文件:
我首先尝试使用env变量强制它使用-m32标志编译为32位二进制文件
export CC="gcc -m32"
我还尝试使用命令
使CFLAG使用我自己的env变量export CFLAG="gcc -m32"
但无济于事。
我尝试通过更改命令
使配置使用我的架构./config fipscanisterbuild
到
./Configure solaris-x86-gcc
它似乎有效,至少它将SIXTY_FOUR_BIT_LONG模式更改为THIRTY_TWO_BIT模式。但是当我编译并尝试链接到fipscanister.o时,我得到了相同的ELFCLASS64错误。
一个问题:
为什么我的fipscanister选项在./config fipscanister中,当它是32位机器时,我的机器被识别为x86_64?
我非常困难,所以如果有人能够解释这个令人困惑的问题,那就太棒了。
答案 0 :(得分:1)
使用32位或64位Solaris 10构建32位OpenSSL库 gcc,我们这样做:
export MACHINE=x86 export CC='gcc -m32'
导出CC
和MACHINE
后,请运行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
...