【问题标题】:Cannot build GDB master Jul 9 2020 on Ubuntu 20.04无法在 Ubuntu 20.04 上构建 GDB master 2020 年 7 月 9 日
【发布时间】:2020-07-25 23:25:47
【问题描述】:

尝试通过

构建 gdb master(e79eb02f2f09baecffb144bac6804f975065466f,自 2020 年 7 月 9 日起)
./configure && make -j4

gdb as 最终链接过程中的错误

  CXXLD  gdb
init.c:215: error: undefined reference to '_initialize_ser_hard()'
init.c:236: error: undefined reference to '_initialize_tui_()'
init.c:244: error: undefined reference to '_initialize_array_vie()'
init.c:249: error: undefined reference to '_initialize_copy_bit()'
init.c:253: error: undefined reference to '_initialize_function_vie()'
init.c:263: error: undefined reference to '_initialize_rsp_lo()'
init.c:267: error: undefined reference to '_initialize_string_vie()'
init.c:287: error: undefined reference to '_initialize_break_catch_thro()'
init.c:297: error: undefined reference to '_initialize_corelo()'
init.c:307: error: undefined reference to '_initialize_d()'
init.c:309: error: undefined reference to '_initialize_d()'
init.c:311: error: undefined reference to '_initialize_d()'
init.c:312: error: undefined reference to '_initialize_d()'
init.c:323: error: undefined reference to '_initialize_frame_un()'
init.c:334: error: undefined reference to '_initialize_inflo()'
collect2: error: ld returned 1 exit status

这是一个已知问题吗?

有什么问题?

更新

我已将错误追踪到 gdb/init.c(由构建生成),其中包含似乎从末端截断的符号。例如,关于符号_initialize_ser_hard 用作

...
extern initialize_file_ftype _initialize_ser_hard;
...
void
initialize_all_files (void)
{
  ...
  _initialize_ser_hard ();
...

gdb/init.c。但是_initialize_ser_hard 在源代码树的其余部分中找不到。但是符号_initialize_ser_hardwire 是在文件gdb/ser-unix.c 中定义的。我认为其余缺失的符号也是如此。所以我的结论是gdb/init.c的生成是错误的。

【问题讨论】:

    标签: gdb linker-errors build-error


    【解决方案1】:

    我已经检查如下,发现GDB masterUbuntu 20.04 上没有这样的固有问题,所以它必须是系统特定的,正如另一个答案所建议的那样。

    首先我用今天最新的 GDB master(2020-08-04)检查了它:

    $ docker run -ti ubuntu:20.04
    ...
    # apt-get update && apt-get install bison flex binutils git make g++ texinfo
    ...
    # git clone git://sourceware.org/git/binutils-gdb.git
    ...
    # cd binutils-gdb
    # mkdir build && cd build
    # CC=gcc ../configure
    ...
    # make -j4
    ... ... ... ...
    # gdb/gdb --version
    GNU gdb (GDB) 10.0.50.20200804-git
    ...
    

    然后找到了 2020 年 7 月 9 日的最新提交 ID,它也有效:

    # cd ..
    # git checkout f37e5866aa72e76f2199155fb838ffc25c78a26e
    ...
    # mkdir build-20200709 && cd build-20200709
    # CC=gcc ../configure
    ...
    # make -j4
    ... ... ... ...
    # gdb/gdb --version
    GNU gdb (GDB) 10.0.50.20200709-git
    ...
    

    ... 然后注意到您提到了实际的提交 ID,它也起作用了:

    # cd ..
    # git checkout e79eb02f2f09baecffb144bac6804f975065466f
    ...
    # mkdir build-e79eb02f2f09baecffb144bac6804f975065466f
    # cd build-e79eb02f2f09baecffb144bac6804f975065466f
    # CC=gcc ../configure
    ...
    # make -j4
    ... ... ... ...
    # gdb/gdb --version
    GNU gdb (GDB) 10.0.50.20200725-git
    ...
    

    【讨论】:

    • 好的。谢谢。我可以在 docker 容器中构建,然后将构建安装到我的主机中吗?
    • 我问了自己同样的问题,然后直接在主机上构建和安装,ubuntu 18.04。通过sudo make install 安装,导致至少有多个新子文件夹和许多文件部署在/usr/local 周围。如果没有sudo,它将无法正常工作,因为它全部归root 所有。然后我不得不从 git repo 的根目录sudo cp -rf gdb/python/lib/gdb/* /usr/local/share/gdb/python/gdb/ 修复gdb --version 上的Python Exception,最后我可以在 vscode + code-d 中更好地调试我的 D 程序,这要感谢 Schuetze & Buclaw 最近的修复d-demangle.c 在 GDB 主控中。
    • 可能值得一试docker cp -r container_name:/path/to/build 目录和主机上的sudo make install。它应该导致更新的gdb 位于/usr/local/bin/gdb 之下,它位于Ubuntu 附带的/usr/bin/gdb 前面。需要启动一个新的 shell(或刷新旧的,现在确定如何),以便获取新的 gdb
    【解决方案2】:

    好吧,我也是,FWIW。

    在 Fedora 32 x86_64 上。

    我注意到在生成的 gdb/Makefile 中,我收到警告“Sucpisious line 593”,在我的情况下,保存在 emacs 中。这是 Makefile 的部分,最后一行是空的或仅选项卡的第 593 行:

    INTERNAL_CPPFLAGS = $(CPPFLAGS) - I/usr/include/guile/2.0 -pthread -I/usr/include/\python3.8 -I/usr/include/python3.8 \

    注意继续“”

    【讨论】:

    • 看来我并没有产生幻觉... ;)
    【解决方案3】:

    _initialize_ser_hard 尝试在 Fedora 上构建 gdb-10.1 时遇到了同样的问题,这是一个语言环境问题。

    罪魁祸首是 gdb/Makefile 中的 sed 语句

    @-for f in $(INIT_FILES); do \
        sed -n -e 's/^_initialize_\([a-z_0-9A-Z]*\).*/\1/p' \
            $(srcdir)/$$f 2>/dev/null; \
    

    这假定a-z 扩展为az 之间的所有ASCII 字符,但至少sv_SE.UTF-8 并且可能丹麦语和其他一些语言不包括上述模式中的w,以及_initialize_ser_hardwire变为 ser_hard 而不是预期的 ser_hardwire

    在 sed 命令上添加 LC_COLLATE=C 防护可以得到预期的结果。

    我不知道这是预期的还是正确的,但我知道 w 在瑞典语中的地位有一段曲折的历史,直到最近才成为官方字符,并且通常与 v making 排序相同vw 之间没有区别。

    【讨论】:

      【解决方案4】:

      有什么问题?

      GDB 中没有_initialize_break_catch_thro(),但有_initialize_break_catch_throw() here

      您似乎在某处有一个损坏的 .o 文件,不知何故,很多函数都丢失了最后一个字符。

      我不知道这是怎么发生的,但是删除整个构建目录并重新构建将是我的第一步。

      更新:

      LD=ld.bfd ./configure
      现在我得到构建错误

      您遇到的构建错误可能可能来自使用不同的链接器。

      要么您的系统以某种方式出现问题(我会fsck 所有磁盘并重新启动),要么您忽略了一些相关信息和/或进行了其他更改。

      【讨论】:

      • 我更新了答案。您的更新忽略的一件事是新的构建错误是来自 GDB 目录中的make,还是来自其他地方。
      • 我尝试构建为新的默认用户。同样的错误。真的很奇怪。我想知道/usr/local/ 下的内容是否是原因。有没有办法查看确切的命令行调用而不仅仅是CXXLD gdb
      • 顺便说一句,在全新安装的 Ubuntu 上/usr/local/ 的内容是否为空?
      • 在此线程顶部查看我的更新。我已将错误追溯到gdb/init.c 中的截断符号。这是一个奇怪的...
      猜你喜欢
      • 2022-07-20
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多