我有下面的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命令的-ldl
和libcrypto
之后添加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/