2012-09-27 93 views
4

我试图调试一个64位程序,但gdb似乎认为它有一个i386架构。gdb为什么认为我的x86-64程序是i386?

# file /usr/local/bin/foo 
/usr/local/bin/foo: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.4.0, not stripped 


# gdb --args foo bar 
GNU gdb (GDB) 7.3.1 
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-pc-linux-gnu". 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>... 
Reading symbols from /usr/local/bin/foo...done. 
(gdb) set debug arch 1 
(gdb) show debug arch 
Architecture debugging is 1. 
(gdb) info target 
Symbols from "/usr/local/bin/foo". 
Local exec file: 
gdbarch_find_by_info: info.bfd_arch_info i386:x86-64 
gdbarch_find_by_info: info.byte_order 1 (little) 
gdbarch_find_by_info: info.osabi 5 (GNU/Linux) 
gdbarch_find_by_info: info.abfd 0xaf4a90 
gdbarch_find_by_info: info.tdep_info 0x0 
gdbarch_find_by_info: Previous architecture 0xb05790 (i386:x86-64) selected 
    `/usr/local/bin/foo', file type elf64-x86-64. 
    Entry point: 0x419730 
    0x00000000004001c8 - 0x00000000004001e4 is .interp 
    0x00000000004001e4 - 0x0000000000400204 is .note.ABI-tag 
    0x0000000000400208 - 0x0000000000402560 is .hash 
    0x0000000000402560 - 0x0000000000409898 is .dynsym 
    0x0000000000409898 - 0x0000000000411188 is .dynstr 
    0x0000000000411188 - 0x0000000000411b22 is .gnu.version 
    0x0000000000411b28 - 0x0000000000411b88 is .gnu.version_r 
    0x0000000000411b88 - 0x00000000004181a0 is .rela.dyn 
    0x00000000004181a0 - 0x0000000000418e78 is .rela.plt 
    0x0000000000418e78 - 0x0000000000418e90 is .init 
    0x0000000000418e90 - 0x0000000000419730 is .plt 
    0x0000000000419730 - 0x00000000004ede38 is .text 
    0x00000000004ede38 - 0x00000000004ede46 is .fini 
    0x00000000004ede48 - 0x00000000004ede4c is .eh_frame 
    0x00000000006ee000 - 0x00000000006ee010 is .ctors 
    0x00000000006ee010 - 0x00000000006ee020 is .dtors 
    0x00000000006ee020 - 0x00000000006ee028 is .jcr 
    0x00000000006ee028 - 0x00000000006ee1f8 is .dynamic 
    0x00000000006ee1f8 - 0x00000000006f07f0 is .got 
    0x00000000006f07f0 - 0x00000000006f0c50 is .got.plt 
    0x00000000006f0c50 - 0x0000000000736c70 is .data 
    0x0000000000736c70 - 0x000000000073b420 is .bss 
(gdb) start 
Temporary breakpoint 1 at 0x419e70: file foo.lpr, line 69. 
Starting program: /usr/local/bin/foo bar 
warning: Selected architecture i386:x86-64 is not compatible with reported target architecture i386 
gdbarch_find_by_info: info.bfd_arch_info i386:x86-64 
gdbarch_find_by_info: info.byte_order 1 (little) 
gdbarch_find_by_info: info.osabi 5 (GNU/Linux) 
gdbarch_find_by_info: info.abfd 0xaf4a90 
gdbarch_find_by_info: info.tdep_info 0x0 
gdbarch_find_by_info: Target rejected architecture 
gdbarch_update_p: Architecture not found 
warning: Architecture rejected target-supplied description 
gdbarch_find_by_info: info.bfd_arch_info i386:x86-64 
gdbarch_find_by_info: info.byte_order 1 (little) 
gdbarch_find_by_info: info.osabi 5 (GNU/Linux) 
gdbarch_find_by_info: info.abfd 0xd6ce90 
gdbarch_find_by_info: info.tdep_info 0x0 
gdbarch_find_by_info: Previous architecture 0xb05790 (i386:x86-64) selected 
Error in re-setting breakpoint 1: Cannot access memory at address 0x419e60 
Error in re-setting breakpoint 1: Cannot access memory at address 0x419e60 
process 5299 is executing new program: /usr/local/bin/foo 
warning: Selected architecture i386:x86-64 is not compatible with reported target architecture i386 
gdbarch_find_by_info: info.bfd_arch_info i386:x86-64 
gdbarch_find_by_info: info.byte_order 1 (little) 
gdbarch_find_by_info: info.osabi 5 (GNU/Linux) 
gdbarch_find_by_info: info.abfd 0xb21790 
gdbarch_find_by_info: info.tdep_info 0x0 
gdbarch_find_by_info: Target rejected architecture 
Architecture of file not recognized. 

注意警告:

warning: Selected architecture i386:x86-64 is not compatible with reported target architecture i386 

然后:

gdbarch_find_by_info: Target rejected architecture 
gdbarch_update_p: Architecture not found 
warning: Architecture rejected target-supplied description 

在gdb中,如果我输入 '集架构',打标签,我看到以下内容:

(gdb) set architecture 
auto    i386:intel   i386:x64-32:intel i386:x86-64:intel 
i386    i386:x64-32  i386:x86-64  i8086 

我的问题是:为什么gdb thi nk我的文件有一个i386体系结构,即使它显然是一个x86-64二进制文件,我该怎么办才能修复它?

我的程序是使用FreePascal版本2.6.0编译的。

更新: 我没有在我的Ubuntu 12.04机器上(使用3.2.0-31内核)使用相同的gdb二进制文件和相同的freepascal二进制文件得到任何警告。我试图调试的服务器正在运行2.6.34.10-24内核。在内核或服务器上可能会对gdb产生影响吗?

+0

这个二进制文件是如何编译的?还是编译后手动编辑? –

+0

@DavidSchwartz我刚刚更新了这个问题。它使用FreePascal 2.6.0编译。 –

+0

我投票结束,因为我相信这个问题是由于我运行的平台。它基于Linux,但它不是一个标准的发行版,因此我不认为这个问题会让其他人受益。 –

回答

1

你的问题,从这里开始:

gdbarch_find_by_info:目标拒绝架构

这意味着GDB该目标相关的代码不喜欢一些关于i386:x86-64架构。不幸的是,没有简单的方法来告诉它不喜欢什么 - 你必须调试GDB本身才能找到它。

你能在GDB失败的机器上调试其他二进制文件(例如/bin/date)吗?

+0

是的,我可以调试/斌/日期,但它是在32位有问题的系统。 32位应用程序工作正常。我在调试GDB本身时看到相同的消息。 –

相关问题