From 98c0c7adab507aafc667c7e16217baa655ace841 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Tue, 29 Mar 2011 11:29:26 +0200 Subject: [PATCH] Fix occasional crash on `print errno' with no -pthread and no -g3 (BZ 690908). --- ...337-resolve-tls-without-debuginfo-v2.patch | 147 ++++++------------ gdb.spec | 5 +- 2 files changed, 49 insertions(+), 103 deletions(-) diff --git a/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch b/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch index 300850e..9943e60 100644 --- a/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch +++ b/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch @@ -19,6 +19,8 @@ will get: Attached suggestion patch how to deal with the most common "errno" symbol for the most common under-ggdb3 compiled programs. +Original patch hooked into target_translate_tls_address. But its inferior +call invalidates `struct frame *' in the callers - RH BZ 690908. 2007-11-03 Jan Kratochvil @@ -30,114 +32,55 @@ glibc-debuginfo-2.7-2.x86_64: /usr/lib/debug/lib64/libc.so.6.debug: <81a2> DW_AT_name : (indirect string, offset: 0x280e): __errno_location <81a8> DW_AT_MIPS_linkage_name: (indirect string, offset: 0x2808): *__GI___errno_location -Index: gdb-7.2.50.20101116/gdb/gdbtypes.c +Index: gdb-7.2/gdb/printcmd.c =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/gdbtypes.c 2010-11-16 07:53:59.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/gdbtypes.c 2010-11-16 08:01:33.000000000 +0100 -@@ -4262,6 +4262,9 @@ gdbtypes_post_init (struct gdbarch *gdba - = arch_type (gdbarch, TYPE_CODE_INTERNAL_FUNCTION, 0, - ""); +--- gdb-7.2.orig/gdb/printcmd.c 2011-03-29 10:55:32.000000000 +0200 ++++ gdb-7.2/gdb/printcmd.c 2011-03-29 10:56:00.000000000 +0200 +@@ -947,10 +947,10 @@ validate_format (struct format_data fmt, + static void + print_command_1 (char *exp, int inspect, int voidprint) + { +- struct expression *expr; + struct cleanup *old_chain = 0; + char format = 0; +- struct value *val; ++ /* False GCC warning due to the TRY_CATCH. */ ++ struct value *val = NULL; + struct format_data fmt; + int cleanup = 0; -+ builtin_type->nodebug_text_symbol_errno_location -+ = lookup_function_type (lookup_pointer_type (builtin_type->builtin_int)); -+ - return builtin_type; - } +@@ -971,10 +971,25 @@ print_command_1 (char *exp, int inspect, -Index: gdb-7.2.50.20101116/gdb/gdbtypes.h -=================================================================== ---- gdb-7.2.50.20101116.orig/gdb/gdbtypes.h 2010-11-16 07:53:59.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/gdbtypes.h 2010-11-16 08:01:33.000000000 +0100 -@@ -1294,6 +1294,8 @@ struct builtin_type - - /* This type is used to represent a GDB internal function. */ - struct type *internal_fn; + if (exp && *exp) + { ++ struct expression *expr; ++ volatile struct gdb_exception except; + -+ struct type *nodebug_text_symbol_errno_location; - }; - - /* Return the type table for the specified architecture. */ -Index: gdb-7.2.50.20101116/gdb/parse.c -=================================================================== ---- gdb-7.2.50.20101116.orig/gdb/parse.c 2010-11-16 07:53:59.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/parse.c 2010-11-16 08:01:33.000000000 +0100 -@@ -530,7 +530,11 @@ write_exp_msymbol (struct minimal_symbol - case mst_text: - case mst_file_text: - case mst_solib_trampoline: -- write_exp_elt_type (objfile_type (objfile)->nodebug_text_symbol); -+ if (builtin_type (gdbarch)->nodebug_text_symbol_errno_location != NULL -+ && strcmp (SYMBOL_LINKAGE_NAME (msymbol), "__errno_location") == 0) -+ write_exp_elt_type (builtin_type (gdbarch)->nodebug_text_symbol_errno_location); -+ else -+ write_exp_elt_type (objfile_type (objfile)->nodebug_text_symbol); - break; - - case mst_text_gnu_ifunc: -Index: gdb-7.2.50.20101116/gdb/target.c -=================================================================== ---- gdb-7.2.50.20101116.orig/gdb/target.c 2010-11-16 08:00:37.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/target.c 2010-11-16 08:01:52.000000000 +0100 -@@ -1067,6 +1067,25 @@ target_is_pushed (struct target_ops *t) - return 0; - } - -+static int -+resolve_errno (void *arg) -+{ -+ CORE_ADDR *arg_addr = arg; -+ struct expression *expr; -+ struct cleanup *old_chain = 0; -+ struct value *val; -+ -+ expr = parse_expression ("__errno_location()"); -+ old_chain = make_cleanup (free_current_contents, &expr); -+ val = evaluate_expression (expr); -+ *arg_addr = value_as_address (val); -+ release_value (val); -+ value_free (val); -+ do_cleanups (old_chain); -+ -+ return 1; -+} -+ - /* Using the objfile specified in OBJFILE, find the address for the - current thread's thread-local storage with offset OFFSET. */ - CORE_ADDR -@@ -1157,7 +1176,28 @@ target_translate_tls_address (struct obj - /* It wouldn't be wrong here to try a gdbarch method, too; finding - TLS is an ABI-specific thing. But we don't do that yet. */ - else -- error (_("Cannot find thread-local variables on this target")); -+ { -+ struct minimal_symbol *msymbol; -+ -+ msymbol = lookup_minimal_symbol ("errno", NULL, NULL); -+ if (msymbol != NULL -+ && SYMBOL_VALUE_ADDRESS (msymbol) == offset -+ && (SYMBOL_OBJ_SECTION (msymbol)->objfile == objfile -+ || (objfile->separate_debug_objfile != NULL -+ && SYMBOL_OBJ_SECTION (msymbol)->objfile -+ == objfile->separate_debug_objfile) -+ || (objfile->separate_debug_objfile_backlink != NULL -+ && SYMBOL_OBJ_SECTION (msymbol)->objfile -+ == objfile->separate_debug_objfile_backlink))) + expr = parse_expression (exp); +- old_chain = make_cleanup (free_current_contents, &expr); ++ old_chain = make_cleanup (xfree, expr); + cleanup = 1; +- val = evaluate_expression (expr); ++ TRY_CATCH (except, RETURN_MASK_ERROR) + { -+ if (!catch_errors (resolve_errno, (void *) &addr, "", -+ RETURN_MASK_ALL)) -+ error (_("TLS symbol `errno' not resolved for non-TLS program." -+ " You should compile the program with `gcc -pthread'.")); ++ val = evaluate_expression (expr); + } -+ else -+ error (_("Cannot find thread-local variables on this target")); -+ } - - return addr; - } -Index: gdb-7.2.50.20101116/gdb/testsuite/gdb.dwarf2/dw2-errno.c ++ if (except.reason < 0) ++ { ++ if (strcmp (exp, "errno") != 0) ++ throw_exception (except); ++ ++ expr = parse_expression ("*((int *(*) (void)) __errno_location) ()"); ++ make_cleanup (xfree, expr); ++ val = evaluate_expression (expr); ++ } + } + else + val = access_value_history (0); +Index: gdb-7.2/gdb/testsuite/gdb.dwarf2/dw2-errno.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-7.2.50.20101116/gdb/testsuite/gdb.dwarf2/dw2-errno.c 2010-11-16 08:01:33.000000000 +0100 ++++ gdb-7.2/gdb/testsuite/gdb.dwarf2/dw2-errno.c 2011-03-29 10:55:35.000000000 +0200 @@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + @@ -167,10 +110,10 @@ Index: gdb-7.2.50.20101116/gdb/testsuite/gdb.dwarf2/dw2-errno.c + + return 0; /* breakpoint */ +} -Index: gdb-7.2.50.20101116/gdb/testsuite/gdb.dwarf2/dw2-errno.exp +Index: gdb-7.2/gdb/testsuite/gdb.dwarf2/dw2-errno.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-7.2.50.20101116/gdb/testsuite/gdb.dwarf2/dw2-errno.exp 2010-11-16 08:01:33.000000000 +0100 ++++ gdb-7.2/gdb/testsuite/gdb.dwarf2/dw2-errno.exp 2011-03-29 10:55:35.000000000 +0200 @@ -0,0 +1,60 @@ +# Copyright 2007 Free Software Foundation, Inc. + diff --git a/gdb.spec b/gdb.spec index 54b2bb2..1d11143 100644 --- a/gdb.spec +++ b/gdb.spec @@ -27,7 +27,7 @@ Version: 7.2.50.20110328 # The release always contains a leading reserved number, start it at 1. # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing. -Release: 31%{?_with_upstream:.upstream}%{?dist} +Release: 32%{?_with_upstream:.upstream}%{?dist} License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain Group: Development/Debuggers @@ -1252,6 +1252,9 @@ fi %{_infodir}/gdb.info* %changelog +* Tue Mar 29 2011 Jan Kratochvil - 7.2.50.20110328-32.fc15 +- Fix occasional crash on `print errno' with no -pthread and no -g3 (BZ 690908). + * Mon Mar 28 2011 Jan Kratochvil - 7.2.50.20110328-31.fc15 - Rebase to FSF GDB 7.2.50.20110328 (which is a 7.3 pre-release). - Bundle %%{libstdcxxpython}.tar.bz2 unconditionally - for rebulds on RHELs.