从源代码构建Erlang OTP的OpenSSL错误

时间:2011-07-07 23:16:27

标签: erlang openssl install ld rpath

尝试构建一个完全独立的OTP,可以独立于系统上安装的库移动。

从源代码构建OpenSSL 1.0.0d,如下所示:

./config --prefix=<open-ssl-dir>
make
make install

然后是OTP R14B03:

./configure --prefix=<erlang-dir> --with-ssl=<open-ssl-dir> --without-termcap

使用Erlang然后失败如下:

relocation R_X86_64_32 against `OPENSSL_ia32cap_P' can not be used when making a shared object; recompile with -fPIC

我们正在谈论Ubuntu 10.04。非常感谢任何帮助 - 谢谢!

3 个答案:

答案 0 :(得分:5)

“在创建共享对象时不能使用;使用-fPIC重新编译”将意味着SSL不是使用位置独立代码标志构建的。将其构建为动态共享对象(DSO)需要这样做。这可能是Erlang构建过程所需要的。示例构建:

$ tar zxvf openssl-0.x.tar.gz
$ cd openssl-x
$ sh config shared -fPIC
$ make
$ sudo make install

答案 1 :(得分:1)

对于ppc64le:

./configure --prefix=/home/huaxin/huaxin/toolsInstalled/ --build=ppc64le CFLAGS="-D_GNU_SOURCE -DOPENSSL_NO_EC=1"

答案 2 :(得分:0)

我建议你在拥有sudo权限的虚拟机上构建。然后使用--prefix = / usr构建像OpenSSL这样的库,以便make install将它们放在通常的系统库中。

然后使用-rpath构建您的工具,在本例中为Erlang。然后使用ldd查找Erlang和任何端口(C扩展)的所有库依赖项,并将它们复制到Erlangs lib目录中。使用readelf -d检查所有二进制文件和库,以确保根据需要将RPATH设置为$ ORIGIN或$ ORIGIN /../ lib。如果链接过程不正确(或者您在系统库的辅助依赖项中复制),请使用patchelf来修复这些问题。

然后使用patchelf为二进制文件(而不是库)设置解释器,使其指向Erlang的lib目录中的ld-linux.so.2。然后使用

运行测试套件

strace -e open erl ...以确保您的构建没有在/ lib或/ usr / lib中打开任何内容。

此时将其tar起来,它将在任何Linux上运行。

有关如何以这种方式构建Python的详细信息,请参阅此问题Compiling Python 2.6.6 and need for external packages wxPython, setuptools, etc... in Ubuntu