ba67a79
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=185337
ba67a79
25ff8a1
2008-02-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
25ff8a1
25ff8a1
	Port to GDB-6.8pre.
ba67a79
b0ab3a8
currently for trivial nonthreaded helloworld with no debug info up to -ggdb2 you
ba67a79
will get:
ba67a79
        (gdb) p errno
aefb0e1
        [some error]
ba67a79
ba67a79
* with -ggdb2 and less "errno" in fact does not exist anywhere as it was
ba67a79
  compiled to "(*__errno_location ())" and the macro definition is not present.
ba67a79
  Unfortunately gdb will find the TLS symbol and it will try to access it but
ba67a79
  as the program has been compiled without -lpthread the TLS base register
ba67a79
  (%gs on i386) is not setup and it will result in:
ba67a79
        Cannot access memory at address 0x8
ba67a79
aefb0e1
Attached suggestion patch how to deal with the most common "errno" symbol
ba67a79
for the most common under-ggdb3 compiled programs.
ba67a79
Jan Kratochvil 98c0c7a
Original patch hooked into target_translate_tls_address.  But its inferior
Jan Kratochvil 98c0c7a
call invalidates `struct frame *' in the callers - RH BZ 690908.
ba67a79
Jan Kratochvil a79edc1
https://bugzilla.redhat.com/show_bug.cgi?id=1166549
Jan Kratochvil a79edc1
ba67a79
b0ab3a8
2007-11-03  Jan Kratochvil  <jan.kratochvil@redhat.com>
ba67a79
b0ab3a8
	* ./gdb/dwarf2read.c (read_partial_die, dwarf2_linkage_name): Prefer
b0ab3a8
	DW_AT_MIPS_linkage_name over DW_AT_name now only for non-C.
ba67a79
b0ab3a8
glibc-debuginfo-2.7-2.x86_64: /usr/lib/debug/lib64/libc.so.6.debug:
b0ab3a8
  <81a2>     DW_AT_name        : (indirect string, offset: 0x280e): __errno_location
b0ab3a8
  <81a8>     DW_AT_MIPS_linkage_name: (indirect string, offset: 0x2808): *__GI___errno_location
b0ab3a8
Jan Kratochvil 22d1e60
Index: gdb-7.10.90.20160211/gdb/printcmd.c
Jan Kratochvil 872aab0
===================================================================
Jan Kratochvil 22d1e60
--- gdb-7.10.90.20160211.orig/gdb/printcmd.c	2016-02-15 23:29:53.062420893 +0100
Jan Kratochvil 22d1e60
+++ gdb-7.10.90.20160211/gdb/printcmd.c	2016-02-15 23:33:31.068968762 +0100
Jan Kratochvil 22d1e60
@@ -1003,6 +1003,10 @@
e5611bf
 
Jan Kratochvil 98c0c7a
   if (exp && *exp)
Jan Kratochvil 98c0c7a
     {
Jan Kratochvil a438e05
+      /* '*((int *(*) (void)) __errno_location) ()' is incompatible with
Jan Kratochvil a438e05
+	 function descriptors.  */
Jan Kratochvil a79edc1
+      if (target_has_execution && strcmp (exp, "errno") == 0)
Jan Kratochvil a438e05
+	exp = "*(*(int *(*)(void)) __errno_location) ()";
Jan Kratochvil 98c0c7a
       expr = parse_expression (exp);
Jan Kratochvil 872aab0
       make_cleanup (free_current_contents, &expr;;
Jan Kratochvil 872aab0
       val = evaluate_expression (expr);
Jan Kratochvil 22d1e60
Index: gdb-7.10.90.20160211/gdb/testsuite/gdb.dwarf2/dw2-errno.c
25ff8a1
===================================================================
25ff8a1
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
Jan Kratochvil 22d1e60
+++ gdb-7.10.90.20160211/gdb/testsuite/gdb.dwarf2/dw2-errno.c	2016-02-15 23:30:20.703617148 +0100
b0ab3a8
@@ -0,0 +1,28 @@
b0ab3a8
+/* This testcase is part of GDB, the GNU debugger.
b0ab3a8
+
b0ab3a8
+   Copyright 2005, 2007 Free Software Foundation, Inc.
b0ab3a8
+
b0ab3a8
+   This program is free software; you can redistribute it and/or modify
b0ab3a8
+   it under the terms of the GNU General Public License as published by
b0ab3a8
+   the Free Software Foundation; either version 3 of the License, or
b0ab3a8
+   (at your option) any later version.
b0ab3a8
+
b0ab3a8
+   This program is distributed in the hope that it will be useful,
b0ab3a8
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
b0ab3a8
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
b0ab3a8
+   GNU General Public License for more details.
b0ab3a8
+
b0ab3a8
+   You should have received a copy of the GNU General Public License
b0ab3a8
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
b0ab3a8
+
b0ab3a8
+   Please email any bugs, comments, and/or additions to this file to:
b0ab3a8
+   bug-gdb@prep.ai.mit.edu  */
b0ab3a8
+
b0ab3a8
+#include <errno.h>
b0ab3a8
+
b0ab3a8
+int main()
b0ab3a8
+{
b0ab3a8
+  errno = 42;
b0ab3a8
+
b0ab3a8
+  return 0;	/* breakpoint */
b0ab3a8
+}
Jan Kratochvil 22d1e60
Index: gdb-7.10.90.20160211/gdb/testsuite/gdb.dwarf2/dw2-errno.exp
25ff8a1
===================================================================
25ff8a1
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
Jan Kratochvil 22d1e60
+++ gdb-7.10.90.20160211/gdb/testsuite/gdb.dwarf2/dw2-errno.exp	2016-02-15 23:35:25.582781821 +0100
dd46ae6
@@ -0,0 +1,60 @@
b0ab3a8
+# Copyright 2007 Free Software Foundation, Inc.
b0ab3a8
+
b0ab3a8
+# This program is free software; you can redistribute it and/or modify
b0ab3a8
+# it under the terms of the GNU General Public License as published by
b0ab3a8
+# the Free Software Foundation; either version 3 of the License, or
b0ab3a8
+# (at your option) any later version.
b0ab3a8
+#
b0ab3a8
+# This program is distributed in the hope that it will be useful,
b0ab3a8
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
b0ab3a8
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
b0ab3a8
+# GNU General Public License for more details.
b0ab3a8
+#
b0ab3a8
+# You should have received a copy of the GNU General Public License
b0ab3a8
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
b0ab3a8
+
b0ab3a8
+set testfile dw2-errno
b0ab3a8
+set srcfile ${testfile}.c
Jan Kratochvil 22d1e60
+set binfile [standard_output_file ${testfile}]
b0ab3a8
+
b0ab3a8
+proc prep {} {
b0ab3a8
+    global srcdir subdir binfile
b0ab3a8
+    gdb_exit
b0ab3a8
+    gdb_start
b0ab3a8
+    gdb_reinitialize_dir $srcdir/$subdir
b0ab3a8
+    gdb_load ${binfile}
b0ab3a8
+
b0ab3a8
+    runto_main
b0ab3a8
+
b0ab3a8
+    gdb_breakpoint [gdb_get_line_number "breakpoint"]
b0ab3a8
+    gdb_continue_to_breakpoint "breakpoint"
b0ab3a8
+}
b0ab3a8
+
b0ab3a8
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g2"] != "" } {
b0ab3a8
+    untested "Couldn't compile test program"
b0ab3a8
+    return -1
b0ab3a8
+}
b0ab3a8
+prep
b0ab3a8
+gdb_test "print errno" ".* = 42" "errno with macros=N threads=N"
b0ab3a8
+
b0ab3a8
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g3"] != "" } {
b0ab3a8
+    untested "Couldn't compile test program"
b0ab3a8
+    return -1
b0ab3a8
+}
b0ab3a8
+prep
b0ab3a8
+gdb_test "print errno" ".* = 42" "errno with macros=Y threads=N"
b0ab3a8
+
b0ab3a8
+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g2"] != "" } {
b0ab3a8
+    return -1
b0ab3a8
+}
b0ab3a8
+prep
b0ab3a8
+gdb_test "print errno" ".* = 42" "errno with macros=N threads=Y"
b0ab3a8
+
b0ab3a8
+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g3"] != "" } {
b0ab3a8
+    return -1
b0ab3a8
+}
b0ab3a8
+prep
b0ab3a8
+gdb_test "print errno" ".* = 42" "errno with macros=Y threads=Y"
b0ab3a8
+
b0ab3a8
+# TODO: Test the error on resolving ERRNO with only libc loaded.
b0ab3a8
+# Just how to find the current libc filename?
Jan Kratochvil 22d1e60
Index: gdb-7.10.90.20160211/gdb/testsuite/gdb.dwarf2/dw2-errno2.c
Jan Kratochvil a79edc1
===================================================================
Jan Kratochvil a79edc1
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
Jan Kratochvil 22d1e60
+++ gdb-7.10.90.20160211/gdb/testsuite/gdb.dwarf2/dw2-errno2.c	2016-02-15 23:30:20.703617148 +0100
Jan Kratochvil a79edc1
@@ -0,0 +1,28 @@
Jan Kratochvil a79edc1
+/* This testcase is part of GDB, the GNU debugger.
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+   Copyright 2005, 2007 Free Software Foundation, Inc.
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+   This program is free software; you can redistribute it and/or modify
Jan Kratochvil a79edc1
+   it under the terms of the GNU General Public License as published by
Jan Kratochvil a79edc1
+   the Free Software Foundation; either version 3 of the License, or
Jan Kratochvil a79edc1
+   (at your option) any later version.
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+   This program is distributed in the hope that it will be useful,
Jan Kratochvil a79edc1
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
Jan Kratochvil a79edc1
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Jan Kratochvil a79edc1
+   GNU General Public License for more details.
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+   You should have received a copy of the GNU General Public License
Jan Kratochvil a79edc1
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+   Please email any bugs, comments, and/or additions to this file to:
Jan Kratochvil a79edc1
+   bug-gdb@prep.ai.mit.edu  */
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+#include <errno.h>
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+int main()
Jan Kratochvil a79edc1
+{
Jan Kratochvil a79edc1
+  errno = 42;
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+  return 0;	/* breakpoint */
Jan Kratochvil a79edc1
+}
Jan Kratochvil 22d1e60
Index: gdb-7.10.90.20160211/gdb/testsuite/gdb.dwarf2/dw2-errno2.exp
Jan Kratochvil a79edc1
===================================================================
Jan Kratochvil a79edc1
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
Jan Kratochvil 22d1e60
+++ gdb-7.10.90.20160211/gdb/testsuite/gdb.dwarf2/dw2-errno2.exp	2016-02-15 23:35:25.582781821 +0100
Jan Kratochvil a438e05
@@ -0,0 +1,71 @@
Jan Kratochvil a79edc1
+# Copyright 2007 Free Software Foundation, Inc.
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+# This program is free software; you can redistribute it and/or modify
Jan Kratochvil a79edc1
+# it under the terms of the GNU General Public License as published by
Jan Kratochvil a79edc1
+# the Free Software Foundation; either version 3 of the License, or
Jan Kratochvil a79edc1
+# (at your option) any later version.
Jan Kratochvil a79edc1
+#
Jan Kratochvil a79edc1
+# This program is distributed in the hope that it will be useful,
Jan Kratochvil a79edc1
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
Jan Kratochvil a79edc1
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Jan Kratochvil a79edc1
+# GNU General Public License for more details.
Jan Kratochvil a79edc1
+#
Jan Kratochvil a79edc1
+# You should have received a copy of the GNU General Public License
Jan Kratochvil a79edc1
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+set testfile dw2-errno2
Jan Kratochvil a79edc1
+set srcfile ${testfile}.c
Jan Kratochvil 22d1e60
+set binfile [standard_output_file ${testfile}]
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+proc prep { message {do_xfail 0} } { with_test_prefix $message {
Jan Kratochvil a79edc1
+    global srcdir subdir binfile variant
Jan Kratochvil a79edc1
+    gdb_exit
Jan Kratochvil a79edc1
+    gdb_start
Jan Kratochvil a79edc1
+    gdb_reinitialize_dir $srcdir/$subdir
Jan Kratochvil a79edc1
+    gdb_load ${binfile}${variant}
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+    runto_main
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+    gdb_breakpoint [gdb_get_line_number "breakpoint"]
Jan Kratochvil a79edc1
+    gdb_continue_to_breakpoint "breakpoint"
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+    gdb_test "gcore ${binfile}${variant}.core" "\r\nSaved corefile .*" "gcore $variant"
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+    gdb_test "print errno" ".* = 42"
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+    gdb_test "kill" ".*" "kill" {Kill the program being debugged\? \(y or n\) } "y"
Jan Kratochvil a79edc1
+    gdb_test "core-file ${binfile}${variant}.core" "\r\nCore was generated by .*" "core-file"
Jan Kratochvil a79edc1
+    if $do_xfail {
Jan Kratochvil a79edc1
+	setup_xfail "*-*-*"
Jan Kratochvil a79edc1
+    }
Jan Kratochvil a79edc1
+    gdb_test "print errno" ".* = 42" "print errno for core"
Jan Kratochvil a79edc1
+}}
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+set variant g2thrN
Jan Kratochvil a79edc1
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g2"] != "" } {
Jan Kratochvil a79edc1
+    untested "Couldn't compile test program"
Jan Kratochvil a79edc1
+    return -1
Jan Kratochvil a79edc1
+}
Jan Kratochvil a79edc1
+prep "macros=N threads=N" 1
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+set variant g3thrN
Jan Kratochvil a79edc1
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g3"] != "" } {
Jan Kratochvil a79edc1
+    untested "Couldn't compile test program"
Jan Kratochvil a79edc1
+    return -1
Jan Kratochvil a79edc1
+}
Jan Kratochvil a79edc1
+prep "macros=Y threads=N" 1
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+set variant g2thrY
Jan Kratochvil a79edc1
+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g2"] != "" } {
Jan Kratochvil a79edc1
+    return -1
Jan Kratochvil a79edc1
+}
Jan Kratochvil a438e05
+prep "macros=N threads=Y"
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+set variant g3thrY
Jan Kratochvil a79edc1
+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g3"] != "" } {
Jan Kratochvil a79edc1
+    return -1
Jan Kratochvil a79edc1
+}
Jan Kratochvil a79edc1
+prep "macros=Y threads=Y" 1
Jan Kratochvil a79edc1
+
Jan Kratochvil a79edc1
+# TODO: Test the error on resolving ERRNO with only libc loaded.
Jan Kratochvil a79edc1
+# Just how to find the current libc filename?