我正在尝试编译openssl但遇到错误。使用的CFLAGS是:
-O2 -fPIC -fno-strict-overflow
有人可以向我解释一下.rodata
是什么以及下面的句子是什么意思?
/usr/bin/ld: libcrypto.a(wp_block.o): relocation R_X86_64_32S against `.rodata'
can not be used when making a shared object; recompile with -fPIC
libcrypto.a(wp_block.o): error adding symbols: Bad value
我不确定libcrypto.a是什么,但显然它是openssl的一部分。
怎么可能修复这个?
答案 0 :(得分:12)
/ usr / bin / ld:libcrypto.a(wp_block.o):针对`.rodata'重新定位R_X86_64_32S制作共享对象时不能使用;使用-fPIC libcrypto.a(wp_block.o)重新编译:添加符号错误:错误值
实际上,这意味着您正在构建共享对象,但未指定-fPIC
。 PIC是与位置无关的代码,它确保地址相对于程序计数器,因此代码可以很容易地重新定位(模块的基址可以很容易地改变,而且东西可以正常工作)。
我相信我在Fedora上看过这个问题。由于您声称自己在CFLAGS
中使用了它,请尝试以下方式:
$ make clean && make dclean
$ export CFLAGS="-fPIC"
$ ./config shared no-ssl2 ...
$ make
...
make clean && make dclean
将确保清除所有工件(包括旧目标文件)。
较新版本的OpenSSL会回复make distclean
,而非make dclean
。
我不确定libcrypto.a是什么,但显然它是openssl的一部分。
这是OpenSSL放置加密和帮助程序内容的库,如AES,Cameilla,SHA,大整数等。libssl.a
是SSL和TLS的用途。 libssl.a
取决于libcrypto.a
。
较新版本的OpenSSL在安装后无法找到其共享库。另请参阅OpenSSL错误跟踪器中的Issue 3993, libssl.so.1.1: cannot open shared object file。
您希望使用静态链接,因此库不会破坏您的可执行文件。如果是,那么您可能希望在Makefile中找到-lssl
和-lcrypto
的使用,并将其更改为-l:libssl.a
和-l:libcrypto.a
。
答案 1 :(得分:-1)
尝试 tar -xf openssl-xxx.tar.gz 代替 tar -zxvf openssl-xxx.tar.gz
我不知道为什么它对我有用!