无法安装用 C 编写的链接 OpenSSL 的 python 模块
Cannot install a python module written in C, that links OpenSSL
我正在尝试构建和安装以下 "simple" 模块,它实际上没有做任何事情,但它失败了。
在setup.py
中,我有这个:
from distutils.core import setup, Extension
setup (
name = 'sslmodule',
ext_modules = [
Extension(
'sslmodule',
libraries = ['ssl'],
sources = ['source.c'],
)
]
)
在 source.c
中,我有这段代码(生成素数然后将其丢弃)
#include <Python.h>
#include <openssl/bn.h>
static PyObject * foobar(PyObject *self, PyObject *args) {
BIGNUM * n;
n = BN_generate_prime(NULL, 5, 0, NULL, NULL, NULL, NULL);
BN_clear_free(n);
return NULL;
}
static PyMethodDef MyMethods[] = {
{"foobar", foobar, METH_VARARGS, "does nothing"},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
initsslmodule(void)
{
(void) Py_InitModule("sslmodule", MyMethods);
}
模块中没有其他内容。
当 运行ning python setup.py build
时,会发生这种情况(为了更好的可读性,在此处换行)
$ python setup.py build
running build
running build_ext
building 'sslmodule' extension
creating build
creating build/temp.linux-i686-2.7
i686-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall \
-Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c source.c -o \
build/temp.linux-i686-2.7/source.o
creating build/lib.linux-i686-2.7
i686-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions \
-Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv \
-O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector \
--param=ssp-buffer-size=4 -Wformat -Werror=format-security \
build/temp.linux-i686-2.7/source.o -lssl \
-o build/lib.linux-i686-2.7/sslmodule.so
当我运行安装时,出现这种情况(一切正常)
$ sudo python setup.py install
running install
running build
running build_ext
running install_lib
copying build/lib.linux-i686-2.7/sslmodule.so -> /usr/local/lib/python2.7/dist-packages
running install_egg_info
Removing /usr/local/lib/python2.7/dist-packages/sslmodule-0.0.0.egg-info
Writing /usr/local/lib/python2.7/dist-packages/sslmodule-0.0.0.egg-info
但是,当我尝试将其导入 python 时,发生了这种情况
$ python -c 'import sslmodule'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: /usr/local/lib/python2.7/dist-packages/sslmodule.so: undefined symbol: BN_generate_prime
ssl 模块显然没有正确链接到 SSL 库。当我在模块上 运行 ldd 时,会发生这种情况(不确定是否相关)- 没有 SSL 动态链接
$ ldd /usr/local/lib/python2.7/dist-packages/sslmodule.so
linux-gate.so.1 => (0xb76e7000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb76a9000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74fa000)
/lib/ld-linux.so.2 (0xb76e8000)
我安装了 Ubuntu,python2.7,软件包 libssl-dev
,libssl1.0.0
,libssl1.0.0-dbg
。怎么了?
(实际上是this module that I can't install (issue here),不过我这里尽量简化了代码。)
编辑:
当我尝试 运行 自动生成的 gcc 命令时,但使用 -Xlinker --verbose
,我得到了很多输出,但这部分对 ssl 很重要:
attempt to open /usr/lib/gcc/i686-linux-gnu/4.8/libssl.so failed
attempt to open /usr/lib/gcc/i686-linux-gnu/4.8/libssl.a failed
attempt to open /usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/libssl.so succeeded
-lssl (/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/libssl.so)
建议 SSL 链接正确。然而,ldd 仍然没有在完成的 .so 上显示 libssl。
edit2:
问题似乎从 python 问题变成了 ld/gcc 问题。反正。当我将 -z defs
添加到第二个 gcc 命令时,我看到了这个
build/temp.linux-i686-2.7/source.o: In function `foobar':
(current directory)/source.c:7: undefined reference to `BN_generate_prime'
(current directory)/source.c:9: undefined reference to `BN_clear_free'
build/temp.linux-i686-2.7/source.o: In function `initsslmodule':
(current directory)/source.c:23: undefined reference to `Py_InitModule4'
collect2: error: ld returned 1 exit status
我不知道为什么没有链接库。
答案是将 libcrypto
添加为库。因此,在 setup.py 中,更改此
libraries = ['ssl'],
进入这个
libraries = ['ssl', 'crypto'],
我正在尝试构建和安装以下 "simple" 模块,它实际上没有做任何事情,但它失败了。
在setup.py
中,我有这个:
from distutils.core import setup, Extension
setup (
name = 'sslmodule',
ext_modules = [
Extension(
'sslmodule',
libraries = ['ssl'],
sources = ['source.c'],
)
]
)
在 source.c
中,我有这段代码(生成素数然后将其丢弃)
#include <Python.h>
#include <openssl/bn.h>
static PyObject * foobar(PyObject *self, PyObject *args) {
BIGNUM * n;
n = BN_generate_prime(NULL, 5, 0, NULL, NULL, NULL, NULL);
BN_clear_free(n);
return NULL;
}
static PyMethodDef MyMethods[] = {
{"foobar", foobar, METH_VARARGS, "does nothing"},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
initsslmodule(void)
{
(void) Py_InitModule("sslmodule", MyMethods);
}
模块中没有其他内容。
当 运行ning python setup.py build
时,会发生这种情况(为了更好的可读性,在此处换行)
$ python setup.py build
running build
running build_ext
building 'sslmodule' extension
creating build
creating build/temp.linux-i686-2.7
i686-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall \
-Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c source.c -o \
build/temp.linux-i686-2.7/source.o
creating build/lib.linux-i686-2.7
i686-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions \
-Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv \
-O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector \
--param=ssp-buffer-size=4 -Wformat -Werror=format-security \
build/temp.linux-i686-2.7/source.o -lssl \
-o build/lib.linux-i686-2.7/sslmodule.so
当我运行安装时,出现这种情况(一切正常)
$ sudo python setup.py install
running install
running build
running build_ext
running install_lib
copying build/lib.linux-i686-2.7/sslmodule.so -> /usr/local/lib/python2.7/dist-packages
running install_egg_info
Removing /usr/local/lib/python2.7/dist-packages/sslmodule-0.0.0.egg-info
Writing /usr/local/lib/python2.7/dist-packages/sslmodule-0.0.0.egg-info
但是,当我尝试将其导入 python 时,发生了这种情况
$ python -c 'import sslmodule'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: /usr/local/lib/python2.7/dist-packages/sslmodule.so: undefined symbol: BN_generate_prime
ssl 模块显然没有正确链接到 SSL 库。当我在模块上 运行 ldd 时,会发生这种情况(不确定是否相关)- 没有 SSL 动态链接
$ ldd /usr/local/lib/python2.7/dist-packages/sslmodule.so
linux-gate.so.1 => (0xb76e7000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb76a9000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74fa000)
/lib/ld-linux.so.2 (0xb76e8000)
我安装了 Ubuntu,python2.7,软件包 libssl-dev
,libssl1.0.0
,libssl1.0.0-dbg
。怎么了?
(实际上是this module that I can't install (issue here),不过我这里尽量简化了代码。)
编辑:
当我尝试 运行 自动生成的 gcc 命令时,但使用 -Xlinker --verbose
,我得到了很多输出,但这部分对 ssl 很重要:
attempt to open /usr/lib/gcc/i686-linux-gnu/4.8/libssl.so failed
attempt to open /usr/lib/gcc/i686-linux-gnu/4.8/libssl.a failed
attempt to open /usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/libssl.so succeeded
-lssl (/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/libssl.so)
建议 SSL 链接正确。然而,ldd 仍然没有在完成的 .so 上显示 libssl。
edit2:
问题似乎从 python 问题变成了 ld/gcc 问题。反正。当我将 -z defs
添加到第二个 gcc 命令时,我看到了这个
build/temp.linux-i686-2.7/source.o: In function `foobar':
(current directory)/source.c:7: undefined reference to `BN_generate_prime'
(current directory)/source.c:9: undefined reference to `BN_clear_free'
build/temp.linux-i686-2.7/source.o: In function `initsslmodule':
(current directory)/source.c:23: undefined reference to `Py_InitModule4'
collect2: error: ld returned 1 exit status
我不知道为什么没有链接库。
答案是将 libcrypto
添加为库。因此,在 setup.py 中,更改此
libraries = ['ssl'],
进入这个
libraries = ['ssl', 'crypto'],