【问题标题】:Can GDB reload executable with a statically linked library?GDB 可以使用静态链接库重新加载可执行文件吗?
【发布时间】:2011-12-28 10:46:47
【问题描述】:

通常在使用 gdb 时,我可以停止执行并重建可执行文件并重新启动,而不会丢失断点。当我使用具有静态链接库的可执行文件尝试此操作时,我收到一条错误消息,指出我无法在构建期间打开可执行文件。

一个具体的例子:

库文件:

libtest.h:

int square(int a);

libtest.c:

int square(int a) {
  return a * a;
}

该库是用以下方式编译的:

gcc -g -c libfile.c
ar rcs libtest.a libfile.o

主文件 a.c 包含:

#include <stdio.h>
#include <stdlib.h>
#include "libfile.h"

int main() {
  printf( "2 squared is %d\n", square(2) );
  return 0;
}

项目是这样编译和链接的:

gcc -g -c a.c
gcc a.o -g --static -L. -ltest -o gdb_test

如果我将生成的文件 gdb_test 加载到 gdb 中,它是否正在运行并不重要。只要 gdb 处于打开状态,后续构建就会在链接步骤中失败:

/usr/bin/ld: cannot open output file gdb_test: Permission denied

有没有办法解决这个问题?我希望能够使用 gdb 而不必重新启动它并丢失我的断点。

【问题讨论】:

    标签: c gdb static-libraries


    【解决方案1】:

    这可能是 GDB 或 GCC 版本的问题;它对我有用:

       % gcc -g -c libtest.c
      gcc -g -c libtest.c
       % ar rcs libtest.a libtest.o
      ar rcs libtest.a libtest.o
       % gcc -g -c -Wall a.c
      gcc -g -c -Wall a.c
       % gcc -Wall -g a.o -L. -ltest -o gdb_test
      gcc -Wall -g a.o -L. -ltest -o gdb_test
       % ./gdb_test
      2 squared is 4
       % gdb ./gdb_test
      GNU gdb (GDB) 7.3.50.20111117-cvs-debian
      Copyright (C) 2011 Free Software Foundation, Inc.
      License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
      This is free software: you are free to change and redistribute it.
      There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
      and "show warranty" for details.
      This GDB was configured as "x86_64-linux-gnu".
      For bug reporting instructions, please see:
      <http://www.gnu.org/software/gdb/bugs/>...
      Reading symbols from /home/basile/tmp/gdb_test...done.
      (gdb) r
      r
      Starting program: /home/basile/tmp/gdb_test 
      2 squared is 4
      [Inferior 1 (process 12271) exited normally]
      (gdb) quit
      quit
       % gcc -v
      gcc -v
      Using built-in specs.
      COLLECT_GCC=/usr/bin/gcc-4.6.real
      COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
      Target: x86_64-linux-gnu
      Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.2-9' 
      --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs 
      --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr 
      --program-suffix=-4.6 --enable-shared --enable-linker-build-id 
      --with-system-zlib --libexecdir=/usr/lib --without-included-gettext 
      --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 
      --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug 
      --enable-libstdcxx-time=yes --enable-plugin --enable-objc-gc 
      --with-arch-32=i586
      --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu 
      --host=x86_64-linux-gnu --target=x86_64-linux-gnu
      Thread model: posix
      gcc version 4.6.2 (Debian 4.6.2-9) 
    

    我的系统是 Debian/Sid/amd64。 GCC 是(Debian 4.6.2-9); ld = binutils = ar 是 GNU 黄金(Debian 2.22 的 GNU Binutils); GDB 是 GNU gdb (GDB) 7.3.50.20111117-cvs-debian; Gnu Libc 是(Debian EGLIBC 2.13-24)。内核是Linux版本3.1.0-1-amd64(Debian 3.1.5-1)

    而且我可以从 gdb 内部重新编译程序并运行它:

      % gdb ./gdb_test 
     gdb ./gdb_test 
     GNU gdb (GDB) 7.3.50.20111117-cvs-debian
     Copyright (C) 2011 Free Software Foundation, Inc.
     License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
     This is free software: you are free to change and redistribute it.
     There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
     and "show warranty" for details.
     This GDB was configured as "x86_64-linux-gnu".
     For bug reporting instructions, please see:
     <http://www.gnu.org/software/gdb/bugs/>...
     Reading symbols from /home/basile/tmp/gdb_test...done.
     (gdb) shell  gcc -g -c -Wall a.c
     shell  gcc -g -c -Wall a.c
     (gdb) r
     r
     Starting program: /home/basile/tmp/gdb_test 
     2 squared is 4
     [Inferior 1 (process 12335) exited normally]
     (gdb) shell gcc -Wall -g a.o -L. -ltest -o gdb_test
    
     shell gcc -Wall -g a.o -L. -ltest -o gdb_test
     (gdb) 
     (gdb) r
     r
     `/home/basile/tmp/gdb_test' has changed; re-reading symbols.
     Starting program: /home/basile/tmp/gdb_test 
     2 squared is 4
     [Inferior 1 (process 12346) exited normally]
     (gdb) quit
     quit
      % 
    

    【讨论】:

    • 你可能是对的。我正在使用带有 2.6.32-37 内核的 Ubuntu 10.04。 GCC 为 v4.4.3,GDB 为 v7.1。我想我会等到四月的 12.04。
    • 你可以升级到 Ubuntu 11.04,或者切换到 Linux mint 12,或者花时间重新编译 binutils、gdb、gcc(从他们最近的源代码)。我不认为这是内核问题(但我可能错了)。
    • @Kenneth:似乎适用于 Ubuntu 10.04.3 2.6.32-37-generic、gcc Ubuntu 4.4.3-4ubuntu5、gdb 7.1-ubuntu、libc Ubuntu EGLIBC 2.11.1-0ubuntu7.8 .检查lsof是否有任何其他进程正在持有 gdb_test
    • @another.anon.coward:不,只有 gdb。但是,如果在我收到权限被拒绝消息后,我执行 ls -l,gdb_test 的权限看起来像这样 -????????? ? ? ? ? ? gdb_test。不知道那是什么意思。
    • @BasileStarynkevitch:不太可能。我只在这种情况下看到这个错误。当我退出 gdb 时,错误的文件条目被删除,我可以再次创建文件。
    【解决方案2】:

    /usr/bin/ld: cannot open output file gdb_test: Permission denied

    这不太可能与GDBld(或它们的版本)有关,而且肯定与您对存档库的使用无关。

    发生这种情况的可能性更大,因为您使用了一些“奇怪”的文件系统。也许您正在使用NTFSCIFS 挂载? df . 说什么?

    【讨论】:

    • 运行 df -T 。给出 ext4。但是我在虚拟机上运行操作系统。这有什么好说的吗?
    猜你喜欢
    • 2013-06-24
    • 2011-06-07
    • 2018-12-28
    • 2010-12-16
    • 2015-04-16
    • 2020-04-11
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多