0

我正在尝试从源代码构建最新的 gdb 10.1。

[我想要这样做的原因是我正在尝试调试一个链接到 Python 2.7.18 的自定义构建的程序,并且我的系统 gdb 链接到我的 /lib64 目录中的 Python 2.7.5 的构建,并且不适用于较新版本]。

阅读完 README 文件后,我使用以下方式进行了配置:

../gdb-10.1/configure --with-python=<path to my 2.7.18 installation> --prefix=<path to where I want the new gdb to go>

...然后运行

make all install

...按照说明。但是,每次构建尝试都会以以下形式的大量错误消息失败:

python/py-arch.o: In function `gdbarch_to_arch_object(gdbarch*)':
.../build/gdb/../../../gdb-10.1/gdb/python/py-arch.c:86: undefined reference to `_Py_RefTotal'
python/py-arch.o: In function `gdbpy_ref_policy<_object>::decref(_object*)':
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_RefTotal'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_NegativeRefcount'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_Dealloc'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_RefTotal'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_RefTotal'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_RefTotal'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_NegativeRefcount'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_Dealloc'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_RefTotal'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_Dealloc'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_NegativeRefcount'

在检查配置步骤的输出和 Makefile 本身时,我根本找不到对我在配置时指定的 Python 安装的任何引用(并且我还把它放在我的 LD_LIBRARY_PATH 的头部以确保编译器并且链接器可以在构建时找到它)。

我在这里想念什么?

4

1 回答 1

0

我最近做了类似的事情,也很挣扎,尽管遇到了不同的问题。

我怀疑您的构建问题可能与您使用 LD_LIBRARY_PATH 或来自您的环境的其他内容(PATH、CFLAGS、LDFLAGS 等)有关。您不必在构建期间设置这些。

这是我所做的概述:

(1) 对于 gdb 的构建,我使用了这样的方法:

export PATH=/usr/local/bin:/usr/bin:/bin:/sbin:/usr/sbin
unset LD_LIBRARY_PATH 
../gdb-10.1/configure --prefix=/opt/gdb-10.1  --with-python=/opt/conda-py2.7.18 
make         &> make.log
make install &> make-install.log

PATH 集和 LD_LIBRARY_PATH 未集旨在清理环境。这确保构建只能--with-python用于定位 python(它本身位于bin/python,在 python 前缀下)。(CFLAGS 和 LDFLAGS 也没有设置,也没有任何 PYTHON 变量。)

我保留了make阶段的输出。如果您在那里查看,您应该会看到该with-python选项已被选中。

这一切都很好。

(2) 要调用调试器(并在 /opt 下使用我的 python),我需要一个额外的步骤:设置 LD_LIBRARY_PATH 以便使用我的 pythons libpython:

export LD_LIBRARY_PATH=/opt/conda-py2.7.18/lib
/opt/gdb-10.1/bin/gdb
(gdb) python import sys; print(sys.version)
2.7.18 | Anaconda, Inc.

找到一种方法来避免设置 LD_LIBRARY_PATH 的需要会很好;这可能需要静态链接 libpython,或者引入一些构建标志,例如,使用 rpath。

于 2020-10-27T11:59:27.800 回答