From 08232497166ecbf332f0144a8352dd41d033bbec Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Fri, 1 Dec 2006 18:14:30 +0000 Subject: [PATCH] gdb/ * elfread.c (elf_symtab_read): Treat weak functions as global. gdb/testsuite/ * gdb.base/solib-weak.c, gdb.base/solib-weak.exp, gdb.base/weaklib1.c, gdb.base/weaklib2.c: New files. --- gdb/ChangeLog | 4 + gdb/elfread.c | 2 +- gdb/testsuite/ChangeLog | 5 ++ gdb/testsuite/gdb.base/solib-weak.c | 25 ++++++ gdb/testsuite/gdb.base/solib-weak.exp | 109 ++++++++++++++++++++++++++ gdb/testsuite/gdb.base/weaklib1.c | 24 ++++++ gdb/testsuite/gdb.base/weaklib2.c | 31 ++++++++ 7 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.base/solib-weak.c create mode 100644 gdb/testsuite/gdb.base/solib-weak.exp create mode 100644 gdb/testsuite/gdb.base/weaklib1.c create mode 100644 gdb/testsuite/gdb.base/weaklib2.c diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c26130cf9a..c0a8b9d156 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2006-12-01 Daniel Jacobowitz + + * elfread.c (elf_symtab_read): Treat weak functions as global. + 2006-11-30 Jim Blandy * ada-lang.c (value_subscript_packed): Don't bother to set the diff --git a/gdb/elfread.c b/gdb/elfread.c index 7b4d6d74b4..d642b7ff7f 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -284,7 +284,7 @@ elf_symtab_read (struct objfile *objfile, int dynamic, } else if (sym->section->flags & SEC_CODE) { - if (sym->flags & BSF_GLOBAL) + if (sym->flags & (BSF_GLOBAL | BSF_WEAK)) { ms_type = mst_text; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 102c844620..4a84cbc55a 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-12-01 Daniel Jacobowitz + + * gdb.base/solib-weak.c, gdb.base/solib-weak.exp, gdb.base/weaklib1.c, + gdb.base/weaklib2.c: New files. + 2006-11-29 Nathan Sidwell * gdb.threads/linux-dp.exp: Adjust regexps used to scan thread diff --git a/gdb/testsuite/gdb.base/solib-weak.c b/gdb/testsuite/gdb.base/solib-weak.c new file mode 100644 index 0000000000..09a9cc1842 --- /dev/null +++ b/gdb/testsuite/gdb.base/solib-weak.c @@ -0,0 +1,25 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2006 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. */ + +int +main() +{ + foo (); + return 0; +} diff --git a/gdb/testsuite/gdb.base/solib-weak.exp b/gdb/testsuite/gdb.base/solib-weak.exp new file mode 100644 index 0000000000..79bdec9371 --- /dev/null +++ b/gdb/testsuite/gdb.base/solib-weak.exp @@ -0,0 +1,109 @@ +# Copyright 2006 +# 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. + +# Test setting breakpoints on shared library functions provided by more +# than one shared library, when one of the implementations is a "weak" +# symbol. GDB should set a breakpoint at the first copy it finds. + +# Don't try to run shared library test cases on a remote target for now. +if ![isnative] then { + return 0 +} + +# This test uses GCC-specific syntax. +if [get_compiler_info not-used] { + return -1 +} + +if {![test_compiler_info "gcc-*"]} { + return 0 +} + +proc do_test { lib1opts lib2opts lib1first } { + global objdir srcdir subdir + + set testopts "" + if {$lib1opts == ""} { + append testopts "lib1 nodebug, " + } else { + append testopts "lib1 debug, " + } + if {$lib2opts == ""} { + append testopts "lib2 nodebug, " + } else { + append testopts "lib2 debug, " + } + if {$lib1first} { + append testopts "lib1 first" + } else { + append testopts "lib2 first" + } + + set testfile "solib-weak" + set srcfile ${testfile}.c + set binfile ${objdir}/${subdir}/${testfile} + + set libfile1 "weaklib1" + set libfile2 "weaklib2" + set lib1src ${srcdir}/${subdir}/${libfile1}.c + set lib2src ${srcdir}/${subdir}/${libfile2}.c + set lib1 ${objdir}/${subdir}/${libfile1}.sl + set lib2 ${objdir}/${subdir}/${libfile2}.sl + + if $lib1first { + set exec_opts [list debug shlib=${lib1} shlib=${lib2}] + set expected_file ${libfile1} + } else { + set exec_opts [list debug shlib=${lib2} shlib=${lib1}] + set expected_file ${libfile2} + } + + if { [gdb_compile_shlib ${lib1src} ${lib1} ${lib1opts}] != "" + || [gdb_compile_shlib ${lib2src} ${lib2} ${lib2opts}] != "" + || [gdb_compile "${srcdir}/${subdir}/${srcfile}" ${binfile} executable $exec_opts] != ""} { + return -1 + } + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} + + runto_main + + gdb_breakpoint "bar" + + # If the library which will be used is compiled without debugging + # information, GDB will pick the wrong copy of "bar", i.e. the one + # with debugging information. + + if {(${lib1opts} == "" && ${lib2opts} != "" && ${lib1first} == 1) + || (${lib1opts} != "" && ${lib2opts} == "" && ${lib1first} == 0)} { + setup_kfail *-*-* gdb/1824 + } + + gdb_test "continue" "Breakpoint .* bar .*${expected_file}\\..*" \ + "run to breakpoint - $testopts" +} + +foreach lib1opts {{} {debug}} { + foreach lib2opts {{} {debug}} { + foreach lib1first {1 0} { + do_test $lib1opts $lib2opts $lib1first + } + } +} diff --git a/gdb/testsuite/gdb.base/weaklib1.c b/gdb/testsuite/gdb.base/weaklib1.c new file mode 100644 index 0000000000..c9592e9f41 --- /dev/null +++ b/gdb/testsuite/gdb.base/weaklib1.c @@ -0,0 +1,24 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2006 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. */ + +void __attribute__((weak)) +bar (void) +{ + puts ("bar in u1"); +} diff --git a/gdb/testsuite/gdb.base/weaklib2.c b/gdb/testsuite/gdb.base/weaklib2.c new file mode 100644 index 0000000000..2cc7fbfff2 --- /dev/null +++ b/gdb/testsuite/gdb.base/weaklib2.c @@ -0,0 +1,31 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2006 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. */ + +void bar (void); +void +foo (void) +{ + bar (); +} + +void +bar (void) +{ + puts ("bar in u2"); +} -- 2.34.1