5

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

这怎么可能解决?

4

2 回答 2

12

/usr/bin/ld: libcrypto.a(wp_block.o): 重定位 R_X86_64_32S 对 `.rodata' 制作共享对象时不能使用;使用 -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 安装后无法找到其共享库。另请参阅问题 3993,libssl.so.1.1:无法在 OpenSSL 错误跟踪器中打开共享对象文件。

您想使用静态链接,这样库就不会破坏您的可执行文件。如果是这样,那么您可能想在 Makefile 中找到 and 的用途-lssl-lcrypto并将它们更改为-l:libssl.aand -l:libcrypto.a

于 2014-08-23T21:24:00.650 回答
-1

尝试 tar -xf openssl-xxx.tar.gz 而不是 tar -zxvf openssl-xxx.tar.gz

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

于 2019-07-22T09:49:39.040 回答