我有下面的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} "[email protected]"
        $(COMPILE.cc) -O2 -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "[email protected]" -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重新编译
有什么建议吗?

最佳答案

openssl link 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.a的文件之前。
约定,.so扩展名表示共享库)。
此行为不适用于: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”
对于此问题,请在link命令的-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

关于linux - OpenSSL以静态方式链接libcrypto.a,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45324091/

10-11 16:52