Может ли GDB перезагрузить исполняемый файл со статически связанной библиотекой? - PullRequest
1 голос
/ 28 декабря 2011

Обычно при использовании 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 без перезапуска и потери точек останова.

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

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

Это вряд ли связано с GDB или ld (или их версиями) и, скорее всего, не связано с использованием вами архивной библиотеки.

Гораздо более вероятно, что это происходит, потому что вы используете какую-то "странную" файловую систему. Возможно, вы используете NTFS или CIFS mount? Что говорит df .

1 голос
/ 28 декабря 2011

Это, вероятно, вопрос версий 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 gold (GNU Binutils для Debian 2.22);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
  % 
...