2017-07-26 241 views
1

我有以下makefile,我會以靜態方式添加庫「libcrypto.a」。我需要這樣做,因爲目標系統不能安裝openssl庫。OpenSSL鏈接libcrypto.a以靜態方式

# 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:添加符號時出錯:D SO從命令行丟失「。
    • [絕對路徑] /libcrypto.a -ldl」 libcrypto.a(evp_enc.o):針對`.rodata.str1.1' 創建共享對象時,不能使用重定位R_X86_64_32;與-fPIC

任何建議重新編譯?

+0

你想製作什麼?一個靜態鏈接的可執行文件?或靜態鏈接libcrypto.a的動態鏈接可執行文件?還是共享對象? –

+0

我想要生成一個動態鏈接的可執行文件,它可以靜態鏈接libcrypto.a。 – stackpic91

回答

1

看起來您的libcrypto.a未編譯爲PIC(或至少是PIE),並且您的工具鏈默認爲創建支持PIE的可執行文件。你可能有這樣的命令鏈接:

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

libcrypto的某些部分取決於libdl和的libpthread,所以這些包都是必須的,太多,但你必須動態鏈接他們,因爲他們的glibc的一部分。以靜態方式

+0

我試過了:「-fno-pie -no-pie -lcurses -Wl,-Bstatic -lcrypto -Wl,-Bdynamic -ldl -lpthread」,但是當我在目標機器上運行生成的圖像時,它說它無法找到 /usr/lib/libncourses /usr/lib/libstdC++ – stackpic91

+0

那麼,它解決了你的直接問題。你沒有說出你真正想做的事。靜態鏈接*不是解決您的問題的方法。您需要複製目標環境並針對該環境進行構建,而不是其他系統。 –

1

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 系統上,在搜索名爲libnamespec.a的文件之前,ld將在目錄中搜索名爲 libnamespec.so的庫。 (通過 約定,.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命令行」

對於這個問題缺少,添加在您的鏈接命令-ldllibcryptolibssl


「[絕對路徑] /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