【问题标题】:Compiling Python 3.4 with emscripten on Ubuntu (linkage errors)在 Ubuntu 上使用 emscripten 编译 Python 3.4(链接错误)
【发布时间】:2015-07-15 15:58:00
【问题描述】:

我正在尝试使用 emscripten 从源代码构建 Python 3.4。

我已经下载并成功安装了 emscripten。我在源代码树之外创建了一个构建文件夹。这些是我到目前为止执行的步骤:

  1. 运行配置: $ emconfigure ../Python-3.4.3/configure --without-threads --without-pymalloc --enable-shared --disable-ipv6 --build=i686-linux-gnu

  2. 我注意到在 ../Python-3.4.3/Include/pyport.h 中对 LONG_BIT 的检查与在 emscriptens 标头之一中定义的 #define SIZEOF_LONG 冲突,所以我已注释掉 ../Python-3.4.3/Include/pyport.h 中的检查

  3. 成功运行configure后,我在构建文件夹中运行emmmake make

  4. 我通过运行file python 检查构建的python 文件确实是LLVM 字节码。在对一切都感到满意后,我尝试将生成的 libpython3-4.so 与字节码链接如下:

$ llvm-link libpython3.4.so python -o python.bc

我收到以下错误消息:

错误:链接名为“_Py_open_cloexec_works”的全局变量:符号相乘 定义!

快速搜索源代码显示该符号多次定义:

$ grep -rnw ../Python-3.4.3 -e "_Py_open_cloexec_works" --include=\*.{c,h}
../Python-3.4.3/Python/fileutils.c:33:int _Py_open_cloexec_works = -1;
../Python-3.4.3/Python/fileutils.c:784:    atomic_flag_works = &_Py_open_cloexec_works;
../Python-3.4.3/Modules/posixmodule.c:7702:extern int _Py_open_cloexec_works;
../Python-3.4.3/Modules/posixmodule.c:7725:    int *atomic_flag_works = &_Py_open_cloexec_works;
../Python-3.4.3/Modules/_io/fileio.c:210:extern int _Py_open_cloexec_works;
../Python-3.4.3/Modules/_io/fileio.c:232:    int *atomic_flag_works = &_Py_open_cloexec_works;

所以我在 libpython3.4.so 上运行 nm 来检查导出的符号,我收到以下错误消息:

nm: libpython3.4.so: 文件格式无法识别

我现在已经没有想法了。谁能帮我解决链接问题?

[[附加信息]]

  • clang 版本 3.6.0
  • LLVM 版本 3.6.0svn

【问题讨论】:

    标签: python build llvm emscripten


    【解决方案1】:

    您可以使用强大的objdump 来代替nm。试试objdump -t you_fileobjdump -T you_file

    示例:objdump -t lib.o

    【讨论】:

    • 我刚刚检查了生成的 .so 文件的文件类型。结果是它的 LLVM 位码,所以 nm 和 objdump 都不能识别文件格式。
    • 尝试用 g++5 编译 python,对我来说效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    相关资源
    最近更新 更多