Browse Source
* minsyms.c (lookup_minimal_symbol_by_pc_section): Handle nested symbols. * gdb.arch/i386-size-overlap.c, gdb.arch/i386-size-overlap.exp: New.drow-reverse-20070409-branch
5 changed files with 154 additions and 0 deletions
@ -0,0 +1,53 @@ |
|||||
|
/* Overlapping symbol sizes test program.
|
||||
|
|
||||
|
Copyright 2007 Free Software Foundation, Inc. |
||||
|
|
||||
|
This file is part of GDB. |
||||
|
|
||||
|
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 2 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, write to the Free Software |
||||
|
Foundation, Inc., 59 Temple Place - Suite 330, |
||||
|
Boston, MA 02111-1307, USA. */ |
||||
|
|
||||
|
#ifdef SYMBOL_PREFIX |
||||
|
#define SYMBOL(str) SYMBOL_PREFIX #str |
||||
|
#else |
||||
|
#define SYMBOL(str) #str |
||||
|
#endif |
||||
|
|
||||
|
void |
||||
|
trap (void) |
||||
|
{ |
||||
|
asm ("int $0x03"); |
||||
|
} |
||||
|
|
||||
|
/* Jump from a function with its symbol size set, to a function
|
||||
|
named by a local label. GDB should report the `main' function |
||||
|
even for the rest, after the global `inner' ends. */ |
||||
|
|
||||
|
asm(".text\n" |
||||
|
" .align 8\n" |
||||
|
" .globl " SYMBOL (main) "\n" |
||||
|
SYMBOL (main) ":\n" |
||||
|
" pushl %ebp\n" |
||||
|
" mov %esp, %ebp\n" |
||||
|
" call .Lfunc\n" |
||||
|
" ret\n" |
||||
|
SYMBOL (inner) ":\n" |
||||
|
" ret\n" |
||||
|
" .size " SYMBOL (inner) ", .-" SYMBOL (inner) "\n" |
||||
|
".Lfunc:\n" |
||||
|
" pushl %ebp\n" |
||||
|
" mov %esp, %ebp\n" |
||||
|
" call " SYMBOL (trap) "\n" |
||||
|
" .size " SYMBOL (main) ", .-" SYMBOL (main) "\n"); |
||||
@ -0,0 +1,76 @@ |
|||||
|
# Copyright 2007 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 2 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, write to the Free Software |
||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
||||
|
|
||||
|
# This file is part of the gdb testsuite. |
||||
|
|
||||
|
if $tracelevel { |
||||
|
strace $tracelevel |
||||
|
} |
||||
|
|
||||
|
# Test that GDB can handle overlapping sizes of symbols. |
||||
|
|
||||
|
if ![istarget "i?86-*-*"] then { |
||||
|
verbose "Skipping i386 unwinder tests." |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
set testfile "i386-size-overlap" |
||||
|
set srcfile ${testfile}.c |
||||
|
set binfile ${objdir}/${subdir}/${testfile} |
||||
|
|
||||
|
# some targets have leading underscores on assembly symbols. |
||||
|
# TODO: detect this automatically |
||||
|
set additional_flags "" |
||||
|
if [istarget "i?86-*-cygwin*"] then { |
||||
|
set additional_flags "additional_flags=-DSYMBOL_PREFIX=\"_\"" |
||||
|
} |
||||
|
|
||||
|
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \ |
||||
|
executable [list debug $additional_flags]] != "" } { |
||||
|
untested "i386-size" |
||||
|
return -1 |
||||
|
} |
||||
|
|
||||
|
gdb_exit |
||||
|
gdb_start |
||||
|
gdb_reinitialize_dir $srcdir/$subdir |
||||
|
gdb_load ${binfile} |
||||
|
|
||||
|
# We use gdb_run_cmd so this stands a chance to work for remote |
||||
|
# targets too. |
||||
|
gdb_run_cmd |
||||
|
|
||||
|
gdb_expect { |
||||
|
-re "Program received signal SIGTRAP.*$gdb_prompt $" { |
||||
|
pass "run past main" |
||||
|
} |
||||
|
-re ".*$gdb_prompt $" { |
||||
|
fail "run past main" |
||||
|
} |
||||
|
timeout { |
||||
|
fail "run past main (timeout)" |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
set message "backtrace shows the outer function" |
||||
|
gdb_test_multiple "backtrace 10" $message { |
||||
|
-re "#1\[ \t]*$hex in inner.*$gdb_prompt $" { |
||||
|
fail $message |
||||
|
} |
||||
|
-re "#1\[ \t]*$hex in main.*$gdb_prompt $" { |
||||
|
pass $message |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue