2016-05-06 7 views
3

iOSデバイス用のOpenSSLの特定のバージョンをコンパイルできましたが、現在Mac OSX用にコンパイルしようとしています。私は次のような結果を得るlipo -info libcrypto.a実行するとMac用OpenSSLをコンパイル中にlibcrypto arエラーが発生する

ar r ../../libcrypto.a o_names.o obj_dat.o obj_lib.o obj_err.o obj_xref.o 
ar: ../../libcrypto.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it) 
ar: ../../libcrypto.a: Inappropriate file type or format 

::私は私のbashスクリプトを実行したときしかし、私は次のエラーを取得しています(以下に)これはどんな意味がありません

Architectures in the fat file: libcrypto.a are: i386 x86_64 

を、私のbashスクリプトはOpenSSL for i386を設定しているだけです(私は両方を実行するようにループしていましたが、これらの問題が出始めた時点でx86_64を削除しました)。

私は同様のSOの質問herehereの答えに従ってみました。しかし、それらは同じ結果をもたらした。さらに、OpenSSL WikiのMacのインストール手順も役に立たなかった。


マイスクリプト:

Build.sh

projectDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 
ARCHS=("i386") 
FIPS_VERSION="2.0.12" 
OPENSSL_VERSION="1.0.2g" 

rm -rf openssl* fips* 
if [ -d "out" ]; then 
    rm -rf out 
fi 

mkdir out 
source ./Build-FIPS.sh 
cd $projectDir 
source ./Build-OpenSSL.sh 

Build-OpenSSL.sh

set -e 

function main() { 
    verifyopenssl 
    for ((i=0; i < ${#ARCHS[@]}; i++)) 
    do 
     makeopenssl "${ARCHS[i]}" 
    done 
} 

function verifyopenssl() { 
    gpg --verify $projectDir/../Source/openssl-$OPENSSL_VERSION.tar.gz.asc 
    tar -zxf $projectDir/../Source/openssl-$OPENSSL_VERSION.tar.gz 
    cd openssl-$OPENSSL_VERSION 
} 

function makeopenssl() { 
    BUILD_ARCH=$1 
    SDK_NAME="macosx" 
    GCC=$(xcrun -sdk ${SDK_NAME} -find gcc) 
    SDK_PATH=$(xcrun -sdk ${SDK_NAME} --show-sdk-path) 
    MACHINE="darwin-i386-cc" 
# BSD_ARCH="BSD-generic32" 

    CONFIG_ARGS="$MACHINE \ 
     $BSD_ARCH \ 
     --openssldir=$projectDir/out/openssl_${BUILD_ARCH} \ 
     fips \ 
     --with-fipsdir=${projectDir}/out/fips_${BUILD_ARCH} \ 
     no-idea \ 
     no-cast \ 
     no-seed \ 
     no-md2 \ 
     no-sha0 \ 
     no-whirlpool \ 
     -DL_ENDIAN" 

    export CC="${GCC} -arch ${BUILD_ARCH}" 
    export CFLAGS="-isysroot ${SDK_PATH} -I ${projectDir}/out/fips_${BUILD_ARCH}/include" 
    export LDFLAGS="-arch $BUILD_ARCH" 
    ./Configure ${CONFIG_ARGS} 

    make depend 
    make 
    # make install 
    # make clean && make dclean 
} 

main [email protected] 

答えて

3

は、@ JWWの答えの後、私はメインのMakefile(ルートフォルダ内の1つの)中(ライン69の周りに)次の行を変更すると述べた@jww arリンクする問題を解決したことがわかりました

この変更を加えることで、私はさらにプロセスを進めることができました。しかし、私は他の問題を抱え始めました。さらに「研究」の結果、OpenSSL FAQページが表示されました。このページでは、OpenSSLがMacでのビルドに失敗したという話がありました。OpenSSLのソースコードのルートディレクトリにあるPROBLEMSファイルを指摘しました。このファイルは、MAC ld問題があることを言った:この情報を

This is really a misfeature in ld, which seems to look for .dylib libraries along the whole library path before it bothers looking for .a libraries. This means that -L switches won't matter unless OpenSSL is built with shared library support.

The workaround may be to change the following lines in apps/Makefile and test/Makefile:

LIBCRYPTO=-L.. -lcrypto
LIBSSL=-L.. -lssl

to:

LIBCRYPTO=../libcrypto.a
LIBSSL=../libssl.a

、私はappsフォルダ内のルートMakefileとMakefileのためのパッチファイルを作成しました。私はまた、メインのMakefileとapps/Makefileの命令をコメントアウトして、opensslバイナリ/実行ファイルをビルドする必要があることも発見しました。これは、make installを実行する場合にのみ必要です。

パッチファイルは、Build.shスクリプトと同じレベルに存在します。私のBuild-OpenSSL.shスクリプトで回り込んだ後、私はついにそれをi386x86_64の両方でビルドすることができました。

今後の参考として、2つのパッチファイルの完全な内容と、元の2つのスクリプトファイルを以下に示します。


Build.sh

#!/bin/bash 
# 

projectDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 

ARCHS=("i386" "x86_64") 
FIPS_VERSION="2.0.12" 
OPENSSL_VERSION="1.0.2g" 

rm -rf openssl* 
if [ -d "out" ]; then 
    rm -rf out 
fi 

mkdir out 
source ./Build-FIPS.sh 
source ./Build-OpenSSL.sh 

Build-OpenSSL.sh

#!/bin/bash 
# 

set -e 

function main() { 
    verifyopenssl 
    for ((i=0; i < ${#ARCHS[@]}; i++)) 
    do 
     makeopenssl "${ARCHS[i]}" 
    done 
} 

function verifyopenssl() { 
    gpg --verify $projectDir/../Source/openssl-$OPENSSL_VERSION.tar.gz.asc 
    tar -zxf $projectDir/../Source/openssl-$OPENSSL_VERSION.tar.gz 
    cd openssl-$OPENSSL_VERSION 
} 

function makeopenssl() { 
    BUILD_ARCH=$1 
    SDK_NAME="macosx" 
    GCC=$(xcrun -sdk ${SDK_NAME} -find gcc) 
    SDK_PATH=$(xcrun -sdk ${SDK_NAME} --show-sdk-path) 
    if [[ $BUILD_ARCH = "i386" ]]; then 
     MACHINE="darwin-i386-cc" 
     NISTP="" 
    elif [[ $BUILD_ARCH = "x86_64" ]]; then 
     MACHINE="darwin64-x86_64-cc" 
     NISTP="enable-ec_nistp_64_gcc_128" 
    else 
     exit 
    fi 

    CONFIG_ARGS="$MACHINE \ 
     $NISTP \ 
     --openssldir=$projectDir/out/openssl_${BUILD_ARCH} \ 
     fips \ 
     --with-fipsdir=${projectDir}/out/fips_${BUILD_ARCH} \ 
     no-idea \ 
     no-cast \ 
     no-seed \ 
     no-md2 \ 
     no-sha0 \ 
     no-whirlpool \ 
     -DL_ENDIAN" 

    ./Configure ${CONFIG_ARGS} 

    patch Makefile < ../MainMake.patch 
    patch apps/Makefile < ../AppMake.patch 
    make depend 
    make build_libcrypto build_libssl 
    make install_sw 
    make clean && make dclean 
    patch -R Makefile < ../MainMake.patch 
    patch -R apps/Makefile < ../AppMake.patch 
} 

main [email protected] 

AppMake.patch

--- apps/Makefile 2016-03-01 06:36:53.000000000 -0700 
+++ ../Makefile 2016-05-06 13:00:16.000000000 -0600 
@@ -26,8 +26,8 @@ 

DLIBCRYPTO=../libcrypto.a 
DLIBSSL=../libssl.a 
-LIBCRYPTO=-L.. -lcrypto 
-LIBSSL=-L.. -lssl 
+LIBCRYPTO=../libcrypto.a 
+LIBSSL=../libssl.a 

PROGRAM= openssl 

@@ -101,24 +101,24 @@ 
    $(PERL) $(TOP)/util/files.pl Makefile >> $(TOP)/MINFO 

install: 
- @[ -n "$(INSTALLTOP)" ] # should be set by top Makefile... 
- @set -e; for i in $(EXE); \ 
- do \ 
- (echo installing $$i; \ 
- cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new; \ 
- chmod 755 $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new; \ 
- mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i); \ 
- done; 
- @set -e; for i in $(SCRIPTS); \ 
- do \ 
- (echo installing $$i; \ 
- cp $$i $(INSTALL_PREFIX)$(OPENSSLDIR)/misc/$$i.new; \ 
- chmod 755 $(INSTALL_PREFIX)$(OPENSSLDIR)/misc/$$i.new; \ 
- mv -f $(INSTALL_PREFIX)$(OPENSSLDIR)/misc/$$i.new $(INSTALL_PREFIX)$(OPENSSLDIR)/misc/$$i); \ 
- done 
- @cp openssl.cnf $(INSTALL_PREFIX)$(OPENSSLDIR)/openssl.cnf.new; \ 
- chmod 644 $(INSTALL_PREFIX)$(OPENSSLDIR)/openssl.cnf.new; \ 
- mv -f $(INSTALL_PREFIX)$(OPENSSLDIR)/openssl.cnf.new $(INSTALL_PREFIX)$(OPENSSLDIR)/openssl.cnf 
+ # @[ -n "$(INSTALLTOP)" ] # should be set by top Makefile... 
+ # @set -e; for i in $(EXE); \ 
+ # do \ 
+ # (echo installing $$i; \ 
+ # cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new; \ 
+ # chmod 755 $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new; \ 
+ # mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i.new $(INSTALL_PREFIX)$(INSTALLTOP)/bin/$$i); \ 
+ # done; 
+ # @set -e; for i in $(SCRIPTS); \ 
+ # do \ 
+ # (echo installing $$i; \ 
+ # cp $$i $(INSTALL_PREFIX)$(OPENSSLDIR)/misc/$$i.new; \ 
+ # chmod 755 $(INSTALL_PREFIX)$(OPENSSLDIR)/misc/$$i.new; \ 
+ # mv -f $(INSTALL_PREFIX)$(OPENSSLDIR)/misc/$$i.new $(INSTALL_PREFIX)$(OPENSSLDIR)/misc/$$i); \ 
+ # done 
+ # @cp openssl.cnf $(INSTALL_PREFIX)$(OPENSSLDIR)/openssl.cnf.new; \ 
+ # chmod 644 $(INSTALL_PREFIX)$(OPENSSLDIR)/openssl.cnf.new; \ 
+ # mv -f $(INSTALL_PREFIX)$(OPENSSLDIR)/openssl.cnf.new $(INSTALL_PREFIX)$(OPENSSLDIR)/openssl.cnf 

tags: 
    ctags $(SRC) 

MainMake.patch

--- Makefile 2016-05-06 13:06:11.000000000 -0600 
+++ ../Makefile 2016-05-06 13:06:44.000000000 -0600 
@@ -602,8 +602,8 @@ 
    chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libcrypto.pc 
    cp libssl.pc $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig 
    chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libssl.pc 
- cp openssl.pc $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig 
- chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/openssl.pc 
+ # cp openssl.pc $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig 
+ # chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/openssl.pc 

install_html_docs: 
    here="`pwd`"; \ 
+0

完璧な仕事、別のスクリプト "Build-FIPS.sh"がありますか? – Nilesh

2
ar r ../../libcrypto.a o_names.o obj_dat.o obj_lib.o obj_err.o obj_xref.o 
ar: ../../libcrypto.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it) 
ar: ../../libcrypto.a: Inappropriate file type or format 

arlibtool-arch答えは"... -arch x86_64 -arch i386を指定すると、OpenSSLのビルドシステムが" at Build Multiarch OpenSSL on OS X "という形式でビルドに失敗します。

Appleのlibtoolを使用し、arを使用する必要があります。 Appleのlibtoolはアーキテクチャについて知っていて、arはありません。

もう一度小さなシワは、私が正しく思い出すと、このようなものです。単にあなたができる多くのmakefileで

$(AR) $(ARFLAGS) [email protected] ... 

make AR="libtool -o"が、コマンドがlibtool -o r libcrypto.aまたは類似の出てくるので、この場合は異なっている:それは難しい単にAppleのlibtoolを使用し、arの使用を停止することができます。私はまた、make AR="libtool" ARFLAGS="r -o [email protected]"のようなものもうまくいかないことを思い出すようです。

私はconfigの後にmakefileをパッチするのに使っていました。

AR= ar $(ARFLAGS) rAR= libtool -oへ:

+2

グレート、二度目の今週の私のOpenSSLの建物エラーが(最初の時間は、Windowsのファイルであった)ため、そのメイクファイルでのエラーのためでした。頭がおかげでありがとう、私はそれを調査し、あなたの答えを私の調査結果で更新する。 – AeroBuffalo

関連する問題