我試圖調試一個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產生影響嗎?
這個二進制文件是如何編譯的?還是編譯後手動編輯? –
@DavidSchwartz我剛剛更新了這個問題。它使用FreePascal 2.6.0編譯。 –
我投票結束,因爲我相信這個問題是由於我運行的平臺。它基於Linux,但它不是一個標準的發行版,因此我不認爲這個問題會讓其他人受益。 –