繁体   English   中英

编译OpenSSL for Mac时出现libcrypto ar错误

[英]Getting libcrypto ar error while compiling OpenSSL for Mac

我已经能够为iOS设备编译特定版本的OpenSSL,我现在正在尝试为Mac OSX编译。 但是,当我运行我的bash脚本(下面提供)时,我收到以下错误:

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

当我运行lipo -info libcrypto.a我得到以下结果:

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

这没有任何意义,因为我的bash脚本只为i386配置OpenSSL(我正在循环执行这两个操作,但是一旦我开始遇到这些问题就删除了x86_64)。

在这里这里尝试过类似的SO问题的答案。 但是,那些产生了相同的结果。 此外, 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 $@

按照@ jww的回答,我发现在主Makefile(根文件夹中的那个)中更改以下行(在第69行附近)解决了@jww提到的ar链接问题:

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

做出这一改变确实让我在这个过程中更进一步。 但是,我开始遇到其他问题。 进一步的“研究”让我进入了OpenSSL FAQ页面,其中有一个问题是关于OpenSSL无法在Mac上构建。 它向我指出了OpenSSL源代码根目录中的PROBLEMS文件。 那个文件说有一个MAC ld问题:

这在ld中实际上是一种错误,它似乎在整个库路径中寻找.dylib库,然后它们在寻找.a库之前。 这意味着除非OpenSSL是使用共享库支持构建的,否则-L开关无关紧要。

解决方法可能是更改apps / Makefile和test / Makefile中的以下行:

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

至:

LIBCRYPTO = .. / libcrypto.a
的libssl = .. / libssl.a

有了这些信息,我为根文件创建了一个补丁文件,并在apps文件夹中创建了Makefile。 我还发现我必须注释掉主Makefile和apps/Makefile的指令来构建openssl二进制文件/可执行文件。 只有在您想要运行make install时才需make install

修补程序文件与Build.sh脚本位于同一级别。 在摆弄了我的Build-OpenSSL.sh脚本后,我终于能够为i386x86_64构建它。

为了将来参考,我将包括两个补丁文件的完整内容,以及下面的原始两个脚本文件。


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 $@

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`"; \
 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的构建系统形成命令的方式”OS X上的Build Multiarch OpenSSL上

你需要使用Apple的libtool ,并停止使用ar Apple的libtool知道架构, ar则不然。

如果我没记错的话,另一个小皱纹是makefile做这样的事情。 这使得很难简单地使用Apple的libtool ,并停止使用ar

$(AR) $(ARFLAGS) $@ ...

在许多makefile中你可以简单地make AR="libtool -o" ,但是这种情况不同,因为命令来自libtool -or libcrypto.a或类似的。 我似乎还记得像make AR="libtool" ARFLAGS="r -o $@"这样的东西make AR="libtool" ARFLAGS="r -o $@"也不能正常工作。

我曾经在配置完成后修补makefile。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM