【问题标题】:What does .rodata and -fPIC mean when compiling OpenSSL?编译 OpenSSL 时 .rodata 和 -fPIC 是什么意思?
【发布时间】:2014-10-17 08:30:58
【问题描述】:

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

这怎么可能解决?

【问题讨论】:

标签: makefile openssl cflags


【解决方案1】:

/usr/bin/ld: libcrypto.a(wp_block.o): relocation 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 在安装后无法找到它们的共享库。另请参阅 OpenSSL 错误跟踪器中的 Issue 3993, libssl.so.1.1: cannot open shared object file

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

【讨论】:

  • 构建的每一步都需要设置环境变量吗?或者CFLAGS="-fPIC" ./config shared no-ssl2 ... && make 会做这项工作吗?
【解决方案2】:

试试 tar -xf openssl-xxx.tar.gz 代替 tar -zxvf openssl-xxx.tar.gz

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 2013-12-26
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多