在为Mac编译OpenSSL时出现libcrypto ar错误 [英] Getting libcrypto ar error while compiling OpenSSL for Mac

查看:738
本文介绍了在为Mac编译OpenSSL时出现libcrypto ar错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have been able to compile a specific version of OpenSSL for iOS devices, and I am now trying to compile for Mac OSX. However, when I run my bash script (provided below) I am getting the following error:

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时,会得到以下结果:

When I run lipo -info libcrypto.a I get the following result:

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

这没有任何意义,因为我的bash脚本仅为i386配置OpenSSL(我循环执行这两项操作,但是一旦遇到这些问题,便删除了x86_64).

This does not make any sense, as my bash script is only configuring OpenSSL for i386 (I was looping to do both, but removed x86_64 once I started getting these problems).

我已尝试遵循类似SO问题的答案此处.但是,这些结果相同.此外, OpenSSL Wiki 上的Mac安装说明也没有帮助.

I have tried following the answers for similar SO questions here and here. However, those yielded the same results. Additionally, the Mac installation instructions on the OpenSSL Wiki were of no help either.

我的脚本:

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提到的链接问题:

Following @jww's answer, I found that changing the following line (around line 69) in the main Makefile (the one in the root folder) solved the ar linking problem that @jww mentioned:

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

进行此更改确实使我在此过程中走得更远.但是,我开始遇到其他问题.进一步的研究"使我进入了 OpenSSL FAQ 页面,其中有一个问题正在讨论关于OpenSSL无法在Mac上构建的问题.它向我指出了OpenSSL源代码的根目录中的PROBLEMS文件.该文件说存在MAC ld问题:

Making this change did get me further along in the process. However, I began having other problems. Further "research" led me to the OpenSSL FAQ page which had a question talking about OpenSSL failing to build on Mac. It pointed me to the PROBLEMS file in the root directory of the OpenSSL source code. That file said that there is a MAC ld problem:

这在ld中确实是一个错误的功能,它似乎在寻找.dylib 遍历整个图书馆路径的图书馆,然后才开始寻找 .a库.这意味着,除非OpenSSL,否则-L开关将无关紧要 内置共享库支持.

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.

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

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

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

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

收件人:

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

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

使用此信息,我为根Makefile和apps文件夹中的Makefile创建了补丁文件.我还发现我必须注释掉主要Makefile和apps/Makefile中的指令以构建openssl二进制文件/可执行文件.仅在要运行make install时才需要.

With this information, I created a patch file for the root Makefile and the Makefile in the apps folder. I also found that I had to comment out the instructions in the main Makefile and the apps/Makefile to build the openssl binary / executable. This should only be necessary if you want to run make install.

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

The patch files exists at the same level as the Build.sh script. And after fiddling around with my Build-OpenSSL.sh script I was finally able to get it to build for both i386 and x86_64.

为便于将来参考,我在下面提供了两个补丁文件的完整内容以及下面的原始两个脚本文件.

For future reference, I am including the complete contents of the two patch files, and the original two script files below.

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`"; \

这篇关于在为Mac编译OpenSSL时出现libcrypto ar错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆