1

我有以下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 ”它以动态方式链接库(不适合我的情况)
  • " [absolute path]/libcrypto.a " 它返回 "libcrypto.a(dso_dlfcn.o): undefined reference to symbol 'dlclose@@GLIBC_2.2.5' //lib/x86_64-linux-gnu/libdl.so.2:添加符号时出错:命令行中缺少 DSO”。
    • " [absolute path]/libcrypto.a -ldl "libcrypto.a(evp_enc.o): relocation R_X86_64_32 against `.rodata.str1.1' 在制作共享对象时不能使用;使用 -fPIC 重新编译

有什么建议吗?

4

2 回答 2

4

OpenSSL以静态方式链接lincrypto.a
...
“-lcrypto”它以动态方式链接库(不适合我的情况)

使用-l:libcrypto.a. 它指定库的全名。以下来自LD(1)手册页。见关于 的部分:filename

-l namespec
--library=namespec

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

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

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

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

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

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


"[absolute path]/libcrypto.a" 它返回 "libcrypto.a(dso_dlfcn.o): undefined reference to symbol 'dlclose@@GLIBC_2.2.5' //lib/x86_64-linux-gnu/libdl.so.2:添加符号时出错:命令行中缺少 DSO”

对于此问题,请在链接命令-ldl 之后 libcrypto和中添加。libssl


"[absolute path]/libcrypto.a -ldl"libcrypto.a(evp_enc.o): relocation R_X86_64_32 against `.rodata.str1.1' 在制作共享对象时不能使用;使用 -fPIC 重新编译

对于这个问题,请参阅编译 OpenSSL 时 .rodata 和 -fPIC 是什么意思?并且编译失败并显示“在制作共享对象时无法使用针对 `.rodata.str1.8' 的重定位 R_X86_64_32”</a>。

简而言之,您需要使用该shared选项配置 OpenSSL。如果您不想构建共享库,请添加-fPICCFLAGS. 另请参阅OpenSSL wiki 上的编译和安装。

于 2017-07-26T19:00:30.973 回答
2

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

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

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

于 2017-07-26T11:13:12.257 回答