ld:致命:在 solaris 上编译 libssh2 时,重定位仍然针对可分配但不可写的部分
ld: fatal: relocations remain against allocatable but non-writable sections, when compiling libssh2 on solaris
我正在 Solaris 10 机器上编译 libssh2 版本 1.4.2。
它完成了编译的大部分工作,然后我得到了这个:
libtool: link: gcc -shared -fPIC -DPIC -Wl,-z -Wl,text -Wl,-M -Wl,.libs/libssh2.so.1.0.1.exp -Wl,-h -Wl,libssh2.so.1 -o .libs/libssh2.so.1.0.1 .libs/channel.o .libs/comp.o .libs/crypt.o .libs/hostkey.o .libs/kex.o .libs/mac.o .libs/misc.o .libs/packet.o .libs/publickey.o .libs/scp.o .libs/session.o .libs/sftp.o .libs/userauth.o .libs/transport.o .libs/version.o .libs/knownhost.o .libs/agent.o .libs/openssl.o .libs/libgcrypt.o .libs/pem.o .libs/keepalive.o .libs/global.o -L/export/home/ixbuild/local//lib -lssl -lcrypto -lz -lnsl -lsocket -lc -O2
Text relocation remains referenced
against symbol offset in file
<unknown> 0x10 /export/home/ixbuild/local//lib/libcrypto.a(dsa_asn1.o)
<unknown> 0x24 /export/home/ixbuild/local//lib/libcrypto.a(dsa_asn1.o)
CBIGNUM_it 0x28 /export/home/ixbuild/local//lib/libcrypto.a(dsa_asn1.o)
<unknown> 0x38 /export/home/ixbuild/local//lib/libcrypto.a(dsa_asn1.o)
CBIGNUM_it 0x3c /export/home/ixbuild/local//lib/libcrypto.a(dsa_asn1.o)
... many similar lines ...
ld: fatal: relocations remain against allocatable but non-writable sections
谷歌搜索我发现很多关于这个错误的参考与没有-fPIC
的编译有关,但是这个标志已经被使用了。
奇怪的是,当我第一次安装这台机器时,它工作得很好。当时我用的是libssh2-1.3.0。
更新: @jww 建议这是 this answer 的副本,指出问题缺少 -fPIC
标志。正如问题中已经指出的那样,我已经检查过了并且正在使用 -fPIC
。在下面查看我的答案,了解我的实际解决方案。
至少在我的例子中,这是由于尝试使用 gcc 编译新版本的 libssh2,并且 link 针对以前使用 Solaris cc 编译的 openssl 库。
通过添加一个 CC 环境变量强制 configure
使用 Solaris cc 命令,就像这样,我可以编译它:
CC="/opt/solstudio12.2/bin/cc" ./configure --prefix=/export/home/ixbuild/local --disable-static
查看我之前执行的安装的笔记,我以前不需要这样做,所以配置脚本已经以某种方式更改为更喜欢 gcc(如果可用),或者环境已经改变(我是不完全确定 gcc 是否在我之前构建时的路径中)。
我正在 Solaris 10 机器上编译 libssh2 版本 1.4.2。
它完成了编译的大部分工作,然后我得到了这个:
libtool: link: gcc -shared -fPIC -DPIC -Wl,-z -Wl,text -Wl,-M -Wl,.libs/libssh2.so.1.0.1.exp -Wl,-h -Wl,libssh2.so.1 -o .libs/libssh2.so.1.0.1 .libs/channel.o .libs/comp.o .libs/crypt.o .libs/hostkey.o .libs/kex.o .libs/mac.o .libs/misc.o .libs/packet.o .libs/publickey.o .libs/scp.o .libs/session.o .libs/sftp.o .libs/userauth.o .libs/transport.o .libs/version.o .libs/knownhost.o .libs/agent.o .libs/openssl.o .libs/libgcrypt.o .libs/pem.o .libs/keepalive.o .libs/global.o -L/export/home/ixbuild/local//lib -lssl -lcrypto -lz -lnsl -lsocket -lc -O2
Text relocation remains referenced
against symbol offset in file
<unknown> 0x10 /export/home/ixbuild/local//lib/libcrypto.a(dsa_asn1.o)
<unknown> 0x24 /export/home/ixbuild/local//lib/libcrypto.a(dsa_asn1.o)
CBIGNUM_it 0x28 /export/home/ixbuild/local//lib/libcrypto.a(dsa_asn1.o)
<unknown> 0x38 /export/home/ixbuild/local//lib/libcrypto.a(dsa_asn1.o)
CBIGNUM_it 0x3c /export/home/ixbuild/local//lib/libcrypto.a(dsa_asn1.o)
... many similar lines ...
ld: fatal: relocations remain against allocatable but non-writable sections
谷歌搜索我发现很多关于这个错误的参考与没有-fPIC
的编译有关,但是这个标志已经被使用了。
奇怪的是,当我第一次安装这台机器时,它工作得很好。当时我用的是libssh2-1.3.0。
更新: @jww 建议这是 this answer 的副本,指出问题缺少 -fPIC
标志。正如问题中已经指出的那样,我已经检查过了并且正在使用 -fPIC
。在下面查看我的答案,了解我的实际解决方案。
至少在我的例子中,这是由于尝试使用 gcc 编译新版本的 libssh2,并且 link 针对以前使用 Solaris cc 编译的 openssl 库。
通过添加一个 CC 环境变量强制 configure
使用 Solaris cc 命令,就像这样,我可以编译它:
CC="/opt/solstudio12.2/bin/cc" ./configure --prefix=/export/home/ixbuild/local --disable-static
查看我之前执行的安装的笔记,我以前不需要这样做,所以配置脚本已经以某种方式更改为更喜欢 gcc(如果可用),或者环境已经改变(我是不完全确定 gcc 是否在我之前构建时的路径中)。