OpenSSL以静态方式链接libcrypto.a

时间:2017-07-26 10:18:48

标签: linux makefile openssl g++ libcrypto

我有以下makefile,我会以静态方式添加库“libcrypto.a”。我需要这样做,因为目标系统无法安装openssl库。

    # Environment
    MKDIR=mkdir
    CP=cp
    GREP=grep
    NM=x86_64-linux-nm
    CCADMIN=CCadmin
    RANLIB=x86_64-linux-ranlib
    CC=x86_64-linux-gnu-gcc
    CCC=x86_64-linux-gnu-g++
    CXX=x86_64-linux-gnu-g++
    FC=x86_64-linux-gfortran
    AS=x86_64-linux-as

    # Macros
    CND_PLATFORM=GNU-Linux
    CND_DLIB_EXT=so
    CND_CONF=Release_x86_64
    CND_DISTDIR=dist
    CND_BUILDDIR=build

    # Include project Makefile
    include Makefile

    # Object Directory
    OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}

    # Object Files
    OBJECTFILES= \
        ${OBJECTDIR}/_ext/7daaf93a/DtaCommand.o \
        ${OBJECTDIR}/_ext/7daaf93a/DtaDev.o \
        ${OBJECTDIR}/_ext/7daaf93a/DtaDevGeneric.o \
        ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal.o \
        ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal1.o \
        ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal2.o \
        ${OBJECTDIR}/_ext/7daaf93a/DtaHashPwd.o \
        ${OBJECTDIR}/_ext/7daaf93a/DtaHexDump.o \
        ${OBJECTDIR}/_ext/7daaf93a/DtaResponse.o \
        ${OBJECTDIR}/_ext/7daaf93a/DtaSession.o \
        ${OBJECTDIR}/_ext/b7b9df0c/blockwise.o \
        ${OBJECTDIR}/_ext/b7b9df0c/chash.o \
        ${OBJECTDIR}/_ext/b7b9df0c/hmac.o \
        ${OBJECTDIR}/_ext/b7b9df0c/pbkdf2.o \
        ${OBJECTDIR}/_ext/b7b9df0c/sha1.o \
        ${OBJECTDIR}/_ext/822bcbe5/DtaDevLinuxNvme.o \
        ${OBJECTDIR}/_ext/822bcbe5/DtaDevLinuxSata.o \
        ${OBJECTDIR}/_ext/822bcbe5/DtaDevOS.o \
        ${OBJECTDIR}/GetPassPhrase.o \
        ${OBJECTDIR}/LinuxPBA.o \
        ${OBJECTDIR}/UnlockSEDs.o


    # C Compiler Flags
    CFLAGS=-m64

    # CC Compiler Flags
    CCFLAGS=-m64
    CXXFLAGS=-m64

    # Link Libraries and Options
    LDLIBSOPTIONS=-lcurses -ltinfo

    # Build Targets
    .build-conf: ${BUILD_SUBPROJECTS}
        "${MAKE}"  -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/linuxpba

    ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/linuxpba: ${OBJECTFILES}
        ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
        ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/linuxpba ${OBJECTFILES} ${LDLIBSOPTIONS} -s

    ${OBJECTDIR}/_ext/7daaf93a/DtaCommand.o: ../Common/DtaCommand.cpp 
        ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
        ${RM} "$@.d"
        $(COMPILE.cc) -O2 -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaCommand.o ../Common/DtaCommand.cpp 

#...... SIMILAR FOR THE OTHER ELEMENTS OF "OBJECTDIR ......"

我试图在我的“LDLIBSOPTIONS”中加入几件事,但我找不到正确的方法,例如:

  • -lcrypto ”它以动态方式链接图书馆(对我的情况不利)
  • [绝对路径] /libcrypto.a ”它返回“libcrypto.a(dso_dlfcn.o):对符号'dlclose @@ GLIBC_2.2.5'的未定义引用 //lib/x86_64-linux-gnu/libdl.so.2:添加符号时出错:命令行中缺少DSO“。
    • [绝对路径] /libcrypto.a-ldl ”libcrypto.a(evp_enc.o):在共享时无法使用针对`.rodata.str1.1'的重定位R_X86_64_32宾语;用-fPIC重新编译

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

  

OpenSSL以静态方式链接lincrypto.a
  ......   " -lcrypto"它以动态的方式链接库(对我的情况不利)

使用-l:libcrypto.a。它指定库的全名。以下是LD(1) man page。请参阅有关:filename的部分。

  

-l namespec
  --library=namespec

     

将namespec指定的存档或目标文件添加到列表中   要链接的文件。此选项可以使用任意次。如果   namespec的格式为:filename,ld将搜索库路径   一个名为filename的文件,否则它将搜索库路径   一个名为libnamespec.a的文件。

     

在支持共享库的系统上,ld也可以搜索   libnamespec.a以外的文件。具体来说,在ELF和SunOS上   系统,ld将在目录中搜索一个名为的库   libnamespec.so在搜索名为libnamespec.a的文件之前。 (通过   约定,.so扩展名表示共享库。)请注意   此行为不适用于:filename,它始终指定a   文件名为filename。

     

链接器将仅在存档位置搜索一次存档   在命令行中指定。如果存档定义了符号   在归档之前出现的某个对象中未定义   在命令行上,链接器将包含相应的文件   来自档案馆。但是,出现的对象中存在未定义的符号   稍后在命令行上不会导致链接器搜索   再次存档。

     

有关强制链接器搜索存档的方法,请参阅-(选项   多次。

     

您可以在命令行上多次列出相同的存档。

     

这种类型的归档搜索是Unix链接器的标准。然而,   如果您在AIX上使用ld,请注意它与   AIX链接器的行为。

  

" [绝对路径] /libcrypto.a"它返回" libcrypto.a(dso_dlfcn.o):未定义的符号引用' dlclose @@ GLIBC_2.2.5' //lib/x86_64-linux-gnu/libdl.so.2:添加符号时出错:命令行中缺少DSO"

对于此问题,请在链接命令中 -ldllibcrypto之后添加libssl

  

" [绝对路径] /libcrypto.a -ldl" libcrypto.a(evp_enc.o):针对`.rodata.str1.1'重新定位R_X86_64_32制作共享对象时不能使用;用-fPIC重新编译

对于此问题,请参阅What does .rodata and -fPIC mean when compiling OpenSSL?Compilation fails with “relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object”

缺点是,您需要使用shared选项配置OpenSSL。如果您不想构建共享库,请将-fPIC添加到CFLAGS。另请参阅OpenSSL wiki上的Compilation and Installation

答案 1 :(得分:1)

看起来您的libcrypto.a未编译为PIC(或至少作为PIE),并且您的工具链默认为创建启用PIE的可执行文件。您可能需要链接这样的命令:

gcc -fno-pie -no-pie … -Wl,-Bstatic -lcrypto -Wl,-Bdynamic -ldl -lpthread

libcrypto的某些部分依赖于libdl和libpthread,所以这些库也是必需的,但是你必须动态链接它们,因为它们是glibc的一部分。