2011-12-28 49 views
1

通常當使用gdb時,我可以停止執行並重建可執行文件並重新啓動而不會丟失我的斷點。當我嘗試使用具有靜態鏈接庫的可執行文件時,出現錯誤,指出在構建過程中無法打開可執行文件。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 

主文件AC包含:

#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而不必重新啓動並釋放斷點。

回答

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 gold(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 
    % 
+0

你可能是對的。我使用Ubuntu 10.04和2.6.32-37內核。 GCC爲v4.4.3,GDB爲v7.1。我想我會等到12月4日的4月份。 – Kenneth 2011-12-28 11:54:03

+0

您可以升級到Ubuntu 11.04,或切換到Linux mint 12,或者花時間重新編譯binutils,gdb,gcc(從他們最近的源代碼中)。我不認爲這是一個內核問題(但我可能是錯的)。 – 2011-12-28 11:57:10

+0

@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 – 2011-12-28 13:20:16

1

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

這不太可能與GDBld(或其版本)有關,而且與您使用歸檔庫無關。

更可能發生這種情況,因爲您正在使用一些「奇怪的」文件系統。也許你正在使用NTFSCIFS掛載? df .說什麼?

+0

運行df -T。給ext4。但是,我正在虛擬機上運行操作系統。那有什麼可說的嗎? – Kenneth 2011-12-29 07:24:34

相關問題