我有以下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”中加入几件事,但我找不到正确的方法,例如:
有什么建议吗?
答案 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"
对于此问题,请在链接命令中 -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。
答案 1 :(得分:1)
看起来您的libcrypto.a
未编译为PIC(或至少作为PIE),并且您的工具链默认为创建启用PIE的可执行文件。您可能需要链接这样的命令:
gcc -fno-pie -no-pie … -Wl,-Bstatic -lcrypto -Wl,-Bdynamic -ldl -lpthread
libcrypto的某些部分依赖于libdl和libpthread,所以这些库也是必需的,但是你必须动态链接它们,因为它们是glibc的一部分。