gdb/
authorDaniel Jacobowitz <drow@false.org>
Fri, 1 Dec 2006 18:14:30 +0000 (18:14 +0000)
committerDaniel Jacobowitz <drow@false.org>
Fri, 1 Dec 2006 18:14:30 +0000 (18:14 +0000)
* 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
gdb/elfread.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/solib-weak.c [new file with mode: 0644]
gdb/testsuite/gdb.base/solib-weak.exp [new file with mode: 0644]
gdb/testsuite/gdb.base/weaklib1.c [new file with mode: 0644]
gdb/testsuite/gdb.base/weaklib2.c [new file with mode: 0644]

index c26130cf9a26e2d7180f8032ba23a7f2a34d2eec..c0a8b9d1564475986f35e3abadd0f26b949a2ab6 100644 (file)
@@ -1,3 +1,7 @@
+2006-12-01  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * elfread.c (elf_symtab_read): Treat weak functions as global.
+
 2006-11-30  Jim Blandy  <jimb@codesourcery.com>
 
        * ada-lang.c (value_subscript_packed): Don't bother to set the
index 7b4d6d74b4f29da99f6cd42416bac22886521281..d642b7ff7fcc870194371bb9c7b52b60e8279960 100644 (file)
@@ -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;
                }
index 102c8446209d1105648871e6bfe18073bffa2437..4a84cbc55a3051050631854d545940e67a59544f 100644 (file)
@@ -1,3 +1,8 @@
+2006-12-01  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * 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  <nathan@codesourcery.com>
 
        * 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 (file)
index 0000000..09a9cc1
--- /dev/null
@@ -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 (file)
index 0000000..79bdec9
--- /dev/null
@@ -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 (file)
index 0000000..c9592e9
--- /dev/null
@@ -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 (file)
index 0000000..2cc7fbf
--- /dev/null
@@ -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");
+}