mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-09 04:21:49 +08:00
Ignore __fu<digits>__ symbols from COFF symbol tables
The debugger sometimes prints strange function names for given addresses. For instance, with the following source code... 4 procedure Foo is 5 A : Integer; 6 begin 7 Do_Nothing (A'Address); 8 end Foo; ... we can see... (gdb) info line 5 Line 5 of "foo.adb" starts at address 0x4017ca <_ada_foo+6> and ends at 0x4017d2 <_fu29__system__scalar_values__is_is4+7>. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _fu29__system__scalar_values__is_is4 is an artificial symbol generated by the linker, and interferes with the pc-to-symbol resolution. There isn't much in the general minimal_symbol data that could help us identify them, so this patch changes the COFF reader to simply ignore them. gdb/ChangeLog: * coffread.c (is_import_fixup_symbol): New function. (record_minimal_symbol): Use is_import_fixup_symbol to detect import fixup symbols, and discard them. gdb/testsuite/ChangeLog: * gdb.ada/win_fu_syms: New testcase.
This commit is contained in:
parent
0349ea227a
commit
af312be731
@ -1,3 +1,9 @@
|
||||
2013-03-28 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* coffread.c (is_import_fixup_symbol): New function.
|
||||
(record_minimal_symbol): Use is_import_fixup_symbol to
|
||||
detect import fixup symbols, and discard them.
|
||||
|
||||
2013-03-28 Doug Evans <dje@google.com>
|
||||
|
||||
* dwarf2read.c (create_debug_types_hash_table): Don't allocate the
|
||||
|
@ -418,6 +418,39 @@ coff_end_symtab (struct objfile *objfile)
|
||||
set_last_source_file (NULL);
|
||||
}
|
||||
|
||||
/* The linker sometimes generates some non-function symbols inside
|
||||
functions referencing variables imported from another DLL.
|
||||
Return nonzero if the given symbol corresponds to one of them. */
|
||||
|
||||
static int
|
||||
is_import_fixup_symbol (struct coff_symbol *cs,
|
||||
enum minimal_symbol_type type)
|
||||
{
|
||||
/* The following is a bit of a heuristic using the characterictics
|
||||
of these fixup symbols, but should work well in practice... */
|
||||
int i;
|
||||
|
||||
/* Must be a non-static text symbol. */
|
||||
if (type != mst_text)
|
||||
return 0;
|
||||
|
||||
/* Must be a non-function symbol. */
|
||||
if (ISFCN (cs->c_type))
|
||||
return 0;
|
||||
|
||||
/* The name must start with "__fu<digits>__". */
|
||||
if (strncmp (cs->c_name, "__fu", 4) != 0)
|
||||
return 0;
|
||||
if (! isdigit (cs->c_name[4]))
|
||||
return 0;
|
||||
for (i = 5; cs->c_name[i] != '\0' && isdigit (cs->c_name[i]); i++)
|
||||
/* Nothing, just incrementing index past all digits. */;
|
||||
if (cs->c_name[i] != '_' || cs->c_name[i + 1] != '_')
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static struct minimal_symbol *
|
||||
record_minimal_symbol (struct coff_symbol *cs, CORE_ADDR address,
|
||||
enum minimal_symbol_type type, int section,
|
||||
@ -429,6 +462,16 @@ record_minimal_symbol (struct coff_symbol *cs, CORE_ADDR address,
|
||||
if (cs->c_name[0] == '@')
|
||||
return NULL;
|
||||
|
||||
if (is_import_fixup_symbol (cs, type))
|
||||
{
|
||||
/* Because the value of these symbols is within a function code
|
||||
range, these symbols interfere with the symbol-from-address
|
||||
reverse lookup; this manifests itselfs in backtraces, or any
|
||||
other commands that prints symbolic addresses. Just pretend
|
||||
these symbols do not exist. */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bfd_section = cs_to_bfd_section (cs, objfile);
|
||||
return prim_record_minimal_symbol_and_info (cs->c_name, address,
|
||||
type, section,
|
||||
|
@ -1,3 +1,7 @@
|
||||
2013-03-28 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* gdb.ada/win_fu_syms: New testcase.
|
||||
|
||||
2013-03-28 Doug Evans <dje@google.com>
|
||||
|
||||
* gdb.base/maint.exp (maint print statistics): Update expected output.
|
||||
|
35
gdb/testsuite/gdb.ada/win_fu_syms.exp
Normal file
35
gdb/testsuite/gdb.ada/win_fu_syms.exp
Normal file
@ -0,0 +1,35 @@
|
||||
# Copyright 2013 Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
load_lib "ada.exp"
|
||||
|
||||
standard_ada_testfile foo
|
||||
|
||||
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug additional_flags=-bargs additional_flags=-shared additional_flags=-margs]] != "" } {
|
||||
return -1
|
||||
}
|
||||
|
||||
clean_restart ${testfile}
|
||||
|
||||
set loc [gdb_get_line_number "Integer" ${testdir}/foo.adb]
|
||||
gdb_test "info line foo.adb:$loc" \
|
||||
"Line $decimal of \".*foo\\.adb\" starts at address $hex <_ada_foo\\+$decimal> and ends at $hex <_ada_foo\\+$decimal>\\." \
|
||||
"info line on variable declaration"
|
||||
|
||||
set loc [gdb_get_line_number "Do_Nothing" ${testdir}/foo.adb]
|
||||
gdb_test "info line foo.adb:$loc" \
|
||||
"Line $decimal of \".*foo\\.adb\" starts at address $hex <_ada_foo\\+$decimal> and ends at $hex <_ada_foo\\+$decimal>\\." \
|
||||
"info line on Do_Nothing call"
|
||||
|
23
gdb/testsuite/gdb.ada/win_fu_syms/foo.adb
Normal file
23
gdb/testsuite/gdb.ada/win_fu_syms/foo.adb
Normal file
@ -0,0 +1,23 @@
|
||||
-- Copyright 2013 Free Software Foundation, Inc.
|
||||
--
|
||||
-- This program is free software; you can redistribute it and/or modify
|
||||
-- it under the terms of the GNU General Public License as published by
|
||||
-- the Free Software Foundation; either version 3 of the License, or
|
||||
-- (at your option) any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful,
|
||||
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
-- GNU General Public License for more details.
|
||||
--
|
||||
-- You should have received a copy of the GNU General Public License
|
||||
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
pragma Initialize_Scalars;
|
||||
with Pck; use Pck;
|
||||
|
||||
procedure Foo is
|
||||
A : Integer;
|
||||
begin
|
||||
Do_Nothing (A'Address);
|
||||
end Foo;
|
21
gdb/testsuite/gdb.ada/win_fu_syms/pck.adb
Normal file
21
gdb/testsuite/gdb.ada/win_fu_syms/pck.adb
Normal file
@ -0,0 +1,21 @@
|
||||
-- Copyright 2007-2013 Free Software Foundation, Inc.
|
||||
--
|
||||
-- This program is free software; you can redistribute it and/or modify
|
||||
-- it under the terms of the GNU General Public License as published by
|
||||
-- the Free Software Foundation; either version 3 of the License, or
|
||||
-- (at your option) any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful,
|
||||
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
-- GNU General Public License for more details.
|
||||
--
|
||||
-- You should have received a copy of the GNU General Public License
|
||||
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package body Pck is
|
||||
procedure Do_Nothing (A : System.Address) is
|
||||
begin
|
||||
null;
|
||||
end Do_Nothing;
|
||||
end Pck;
|
19
gdb/testsuite/gdb.ada/win_fu_syms/pck.ads
Normal file
19
gdb/testsuite/gdb.ada/win_fu_syms/pck.ads
Normal file
@ -0,0 +1,19 @@
|
||||
-- Copyright 2007-2013 Free Software Foundation, Inc.
|
||||
--
|
||||
-- This program is free software; you can redistribute it and/or modify
|
||||
-- it under the terms of the GNU General Public License as published by
|
||||
-- the Free Software Foundation; either version 3 of the License, or
|
||||
-- (at your option) any later version.
|
||||
--
|
||||
-- This program is distributed in the hope that it will be useful,
|
||||
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
-- GNU General Public License for more details.
|
||||
--
|
||||
-- You should have received a copy of the GNU General Public License
|
||||
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
with System;
|
||||
package Pck is
|
||||
procedure Do_Nothing (A : System.Address);
|
||||
end Pck;
|
Loading…
Reference in New Issue
Block a user