编译OpenSSL时.rodata和-fPIC是什么意思?

时间:2014-08-23 17:52:34

标签: makefile openssl cflags

我正在尝试编译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的一部分。

怎么可能修复这个?

2 个答案:

答案 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

我不知道为什么它对我有用!