diff options
author | hjk <hjk121@nokiamail.com> | 2013-11-04 16:29:39 +0100 |
---|---|---|
committer | hjk <hjk121@nokiamail.com> | 2013-11-05 11:46:13 +0100 |
commit | e2d258842e469265b4dc162bad0936861656d3c3 (patch) | |
tree | 1fb9d475b30197267f8c36ec2b806527ee59c9f0 /dist | |
parent | d3490104456f427993720d8c319f4f013e771e13 (diff) | |
download | qt-creator-e2d258842e469265b4dc162bad0936861656d3c3.tar.gz |
Remove GDB patches
The remaining patches are currently not actively used, and unlikely
to be used again in the future.
Change-Id: Ie2cc47d5076f5e28b8182c0ff06621f576c81d34
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Eike Ziller <eike.ziller@digia.com>
Reviewed-by: David Schulz <david.schulz@digia.com>
Reviewed-by: Rainer Keller <rainer.keller@digia.com>
Diffstat (limited to 'dist')
-rw-r--r-- | dist/gdb/Makefile.linux | 4 | ||||
-rw-r--r-- | dist/gdb/Makefile.mingw | 3 | ||||
-rw-r--r-- | dist/gdb/Makefile.osx | 3 | ||||
-rw-r--r-- | dist/gdb/patches/.gitattributes | 1 | ||||
-rw-r--r-- | dist/gdb/patches/gdb-buildid-locate.patch | 2426 | ||||
-rw-r--r-- | dist/gdb/patches/gdb-ipv6.patch | 1037 | ||||
-rw-r--r-- | dist/gdb/patches/pythonhome.patch | 19 |
7 files changed, 3 insertions, 3490 deletions
diff --git a/dist/gdb/Makefile.linux b/dist/gdb/Makefile.linux index 7f5e78a5ab..be445b059a 100644 --- a/dist/gdb/Makefile.linux +++ b/dist/gdb/Makefile.linux @@ -66,9 +66,7 @@ ${staging}/gdb-${version}/configure: ${source}/gdb-${version}.tar.bz2 | makestag echo "Extracting gdb..." && \ tar xf ${source}/gdb-${version}.tar.bz2 && \ cd gdb-${version} && \ - touch configure && \ - patch -p1 < ${broot}/patches/pythonhome.patch && \ - patch -p2 < ${broot}/patches/gdb-ipv6.patch + touch configure ${gdbtargets}: ${targetdir}/gdb-%: ${staging}/gdb-${version}/configure ${staging}/lib/libpython${pyversion}.a ${staging}/lib/libexpat.a | maketargetdir test -e ${staging}/gdb-${version}-$* || mkdir ${staging}/gdb-${version}-$* diff --git a/dist/gdb/Makefile.mingw b/dist/gdb/Makefile.mingw index e3678e30ff..bf85a7d758 100644 --- a/dist/gdb/Makefile.mingw +++ b/dist/gdb/Makefile.mingw @@ -72,8 +72,7 @@ ${staging}/gdb-${version}/configure: ${source}/gdb-${version}.tar.bz2 | makestag echo "Extracting gdb..." && \ tar xf ${source}/gdb-${version}.tar.bz2 && \ cd gdb-${version} && \ - touch configure && \ - patch -p2 < ${broot}/patches/gdb-ipv6.patch + touch configure ${staging}/lib/libiconv.a: ${source}/libiconv-${iconvversion}.tar.gz | makestagingdir cd ${staging} && \ diff --git a/dist/gdb/Makefile.osx b/dist/gdb/Makefile.osx index 7ce587eb05..1f653d2390 100644 --- a/dist/gdb/Makefile.osx +++ b/dist/gdb/Makefile.osx @@ -65,8 +65,7 @@ ${staging}/gdb-${version}/configure: ${source}/gdb-${version}.tar.bz2 | makestag echo "Extracting gdb..." && \ tar xf ${source}/gdb-${version}.tar.bz2 && \ cd gdb-${version} && \ - touch configure && \ - patch -p2 < ${broot}/patches/gdb-ipv6.patch + touch configure ${gdbtargets}: ${targetdir}/gdb-%: ${staging}/gdb-${version}/configure ${staging}/lib/libpython${pyversion}.a ${staging}/lib/libexpat.a | maketargetdir test -e ${staging}/gdb-${version}-$* || mkdir ${staging}/gdb-${version}-$* diff --git a/dist/gdb/patches/.gitattributes b/dist/gdb/patches/.gitattributes deleted file mode 100644 index dbf3d256b7..0000000000 --- a/dist/gdb/patches/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.patch eol=lf diff --git a/dist/gdb/patches/gdb-buildid-locate.patch b/dist/gdb/patches/gdb-buildid-locate.patch deleted file mode 100644 index 9b7b7ecbef..0000000000 --- a/dist/gdb/patches/gdb-buildid-locate.patch +++ /dev/null @@ -1,2426 +0,0 @@ -diff -rup gdb-7.4ori//gdb/acinclude.m4 gdb-7.4/gdb/acinclude.m4 ---- gdb-7.4ori//gdb/acinclude.m4 2010-05-27 05:40:45.000000000 +0200 -+++ gdb-7.4/gdb/acinclude.m4 2012-05-10 11:26:26.319643428 +0200 -@@ -1,3 +1,5 @@ -+# serial 1 -+ - dnl written by Rob Savoye <rob@cygnus.com> for Cygnus Support - dnl major rewriting for Tcl 7.5 by Don Libes <libes@nist.gov> - -@@ -81,8 +83,6 @@ AC_MSG_RESULT(yes) - # Foundation, Inc., 51 Franklin Street, Fifth Floor, - # Boston, MA 02110-1301, USA. - --# serial 1 -- - # @defmac AC_PROG_CC_STDC - # @maindex PROG_CC_STDC - # @ovindex CC -diff -rup gdb-7.4ori//gdb/aclocal.m4 gdb-7.4/gdb/aclocal.m4 ---- gdb-7.4ori//gdb/aclocal.m4 2011-02-15 22:05:53.000000000 +0100 -+++ gdb-7.4/gdb/aclocal.m4 2012-05-10 11:26:26.315643428 +0200 -@@ -19,6 +19,162 @@ You have another version of autoconf. I - If you have problems, you may need to regenerate the build system entirely. - To do so, use the procedure documented by the package, typically `autoreconf'.])]) - -+# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -+# -+# Copyright © 2004 Scott James Remnant <scott@netsplit.com>. -+# -+# 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. -+# -+# As a special exception to the GNU General Public License, if you -+# distribute this file as part of a program that contains a -+# configuration script generated by Autoconf, you may include it under -+# the same distribution terms that you use for the rest of that program. -+ -+# PKG_PROG_PKG_CONFIG([MIN-VERSION]) -+# ---------------------------------- -+AC_DEFUN([PKG_PROG_PKG_CONFIG], -+[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) -+m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) -+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl -+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then -+ AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) -+fi -+if test -n "$PKG_CONFIG"; then -+ _pkg_min_version=m4_default([$1], [0.9.0]) -+ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) -+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then -+ AC_MSG_RESULT([yes]) -+ else -+ AC_MSG_RESULT([no]) -+ PKG_CONFIG="" -+ fi -+ -+fi[]dnl -+])# PKG_PROG_PKG_CONFIG -+ -+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -+# -+# Check to see whether a particular set of modules exists. Similar -+# to PKG_CHECK_MODULES(), but does not set variables or print errors. -+# -+# -+# Similar to PKG_CHECK_MODULES, make sure that the first instance of -+# this or PKG_CHECK_MODULES is called, or make sure to call -+# PKG_CHECK_EXISTS manually -+# -------------------------------------------------------------- -+AC_DEFUN([PKG_CHECK_EXISTS], -+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -+if test -n "$PKG_CONFIG" && \ -+ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then -+ m4_ifval([$2], [$2], [:]) -+m4_ifvaln([$3], [else -+ $3])dnl -+fi]) -+ -+ -+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) -+# --------------------------------------------- -+m4_define([_PKG_CONFIG], -+[if test -n "$$1"; then -+ pkg_cv_[]$1="$$1" -+ elif test -n "$PKG_CONFIG"; then -+ PKG_CHECK_EXISTS([$3], -+ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], -+ [pkg_failed=yes]) -+ else -+ pkg_failed=untried -+fi[]dnl -+])# _PKG_CONFIG -+ -+# _PKG_SHORT_ERRORS_SUPPORTED -+# ----------------------------- -+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], -+[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then -+ _pkg_short_errors_supported=yes -+else -+ _pkg_short_errors_supported=no -+fi[]dnl -+])# _PKG_SHORT_ERRORS_SUPPORTED -+ -+ -+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -+# [ACTION-IF-NOT-FOUND]) -+# -+# -+# Note that if there is a possibility the first call to -+# PKG_CHECK_MODULES might not happen, you should be sure to include an -+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac -+# -+# -+# -------------------------------------------------------------- -+AC_DEFUN([PKG_CHECK_MODULES], -+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl -+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl -+ -+pkg_failed=no -+AC_MSG_CHECKING([for $1]) -+ -+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) -+_PKG_CONFIG([$1][_LIBS], [libs], [$2]) -+ -+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS -+and $1[]_LIBS to avoid the need to call pkg-config. -+See the pkg-config man page for more details.]) -+ -+if test $pkg_failed = yes; then -+ _PKG_SHORT_ERRORS_SUPPORTED -+ if test $_pkg_short_errors_supported = yes; then -+ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1` -+ else -+ $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` -+ fi -+ # Put the nasty error message in config.log where it belongs -+ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD -+ -+ ifelse([$4], , [AC_MSG_ERROR(dnl -+[Package requirements ($2) were not met: -+ -+$$1_PKG_ERRORS -+ -+Consider adjusting the PKG_CONFIG_PATH environment variable if you -+installed software in a non-standard prefix. -+ -+_PKG_TEXT -+])], -+ [AC_MSG_RESULT([no]) -+ $4]) -+elif test $pkg_failed = untried; then -+ ifelse([$4], , [AC_MSG_FAILURE(dnl -+[The pkg-config script could not be found or is too old. Make sure it -+is in your PATH or set the PKG_CONFIG environment variable to the full -+path to pkg-config. -+ -+_PKG_TEXT -+ -+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])], -+ [$4]) -+else -+ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS -+ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS -+ AC_MSG_RESULT([yes]) -+ ifelse([$3], , :, [$3]) -+fi[]dnl -+])# PKG_CHECK_MODULES -+ - # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. - # - # This file is free software; the Free Software Foundation -diff -rup gdb-7.4ori//gdb/config.in gdb-7.4/gdb/config.in ---- gdb-7.4ori//gdb/config.in 2011-11-20 09:59:56.000000000 +0100 -+++ gdb-7.4/gdb/config.in 2012-05-10 11:26:26.315643428 +0200 -@@ -46,6 +46,9 @@ - /* Define to BFD's default target vector. */ - #undef DEFAULT_BFD_VEC - -+/* librpm version specific library name to dlopen. */ -+#undef DLOPEN_LIBRPM -+ - /* Define to 1 if translation of program messages to the user's native - language is requested. */ - #undef ENABLE_NLS -@@ -233,6 +236,9 @@ - /* Define if Python 2.7 is being used. */ - #undef HAVE_LIBPYTHON2_7 - -+/* Define if librpm library is being used. */ -+#undef HAVE_LIBRPM -+ - /* Define if libunwind library is being used. */ - #undef HAVE_LIBUNWIND - -diff -rup gdb-7.4ori//gdb/configure gdb-7.4/gdb/configure ---- gdb-7.4ori//gdb/configure 2011-12-13 14:08:05.000000000 +0100 -+++ gdb-7.4/gdb/configure 2012-05-10 11:26:26.319643428 +0200 -@@ -684,6 +684,9 @@ REPORT_BUGS_TO - PKGVERSION - TARGET_OBS - subdirs -+RPM_LIBS -+RPM_CFLAGS -+PKG_CONFIG - GDB_DATADIR - DEBUGDIR - am__fastdepCC_FALSE -@@ -952,6 +955,7 @@ enable_dependency_tracking - with_separate_debug_dir - with_gdb_datadir - with_relocated_sources -+with_rpm - enable_targets - enable_64_bit_bfd - enable_gdbcli -@@ -995,6 +999,9 @@ LDFLAGS - LIBS - CPPFLAGS - CPP -+PKG_CONFIG -+RPM_CFLAGS -+RPM_LIBS - MAKEINFO - MAKEINFOFLAGS - YACC -@@ -1658,6 +1665,8 @@ Optional Packages: - [DATADIR/gdb] - --with-relocated-sources=PATH - automatically relocate this path for source files -+ --with-rpm query rpm database for missing debuginfos (yes/no, -+ def. auto=librpm.so) - --with-libunwind use libunwind frame unwinding support - --with-curses use the curses library instead of the termcap - library -@@ -1696,6 +1705,9 @@ Some influential environment variables: - CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if - you have headers in a nonstandard directory <include dir> - CPP C preprocessor -+ PKG_CONFIG path to pkg-config utility -+ RPM_CFLAGS C compiler flags for RPM, overriding pkg-config -+ RPM_LIBS linker flags for RPM, overriding pkg-config - MAKEINFO Parent configure detects if it is of sufficient version. - MAKEINFOFLAGS - YACC The `Yet Another C Compiler' implementation to use. Defaults to -@@ -7968,6 +7980,486 @@ _ACEOF - fi - - -+# Integration with rpm library to support missing debuginfo suggestions. -+# --without-rpm: Disable any rpm support. -+# --with-rpm=libname.so: Try to dynamically open `libname.so' during runtime. -+# Even with runtime missing `libname.so' GDB will still other run correctly. -+# Missing `libname.so' during ./configure will abort the configuration. -+# --with-rpm=librpm.so: Like `--with-rpm=libname.so' but try to find specific -+# minor version first such as `librpm-4.6.so' as minor version differences -+# mean API+ABI incompatibility. If the specific match versioned library name -+# could not be found still open dynamically at least `librpm.so'. -+# --with-rpm: Like `--with-rpm=librpm.so' but if any of its detection fails try -+# to find librpm for compilation-time linking by pkg-config. GDB binary will -+# be probably linked with the version specific library (as `librpm-4.6.so'). -+# Failure to find librpm by pkg-config will abort the configuration. -+# (default) --with-rpm=auto: Like `--with-rpm=librpm.so' but if even pkg-config -+# cannot find librpm use to the rpmless compilation (like `--without-rpm'). -+ -+ -+# Check whether --with-rpm was given. -+if test "${with_rpm+set}" = set; then : -+ withval=$with_rpm; -+else -+ with_rpm="auto" -+fi -+ -+ -+ -+ -+if test "x$with_rpm" != "xno"; then -+ if test "x$with_rpm" = "xyes"; then -+ LIBRPM="librpm.so" -+ RPM_REQUIRE=true -+ DLOPEN_REQUIRE=false -+ elif test "x$with_rpm" = "xauto"; then -+ LIBRPM="librpm.so" -+ RPM_REQUIRE=false -+ DLOPEN_REQUIRE=false -+ else -+ LIBRPM="$with_rpm" -+ RPM_REQUIRE=true -+ DLOPEN_REQUIRE=true -+ fi -+ LIBRPM_STRING='"'"$LIBRPM"'"' -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking specific librpm version" >&5 -+$as_echo_n "checking specific librpm version... " >&6; } -+ HAVE_DLOPEN_LIBRPM=false -+ save_LIBS="$LIBS" -+ LIBS="$LIBS -ldl" -+ if test "$cross_compiling" = yes; then : -+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+as_fn_error "cannot run test program while cross compiling -+See \`config.log' for more details." "$LINENO" 5; } -+else -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+ -+#include <rpm/rpmlib.h> -+#include <dlfcn.h> -+#include <errno.h> -+ -+int -+main () -+{ -+ -+ void *h; -+ const char *const *rpmverp; -+ FILE *f; -+ -+ f = fopen ("conftest.out", "w"); -+ if (!f) -+ { -+ fprintf (stderr, "Cannot write \"%s\": %s\n", "conftest.out", -+ strerror (errno)); -+ return 1; -+ } -+ h = dlopen ($LIBRPM_STRING, RTLD_LAZY); -+ if (!h) -+ { -+ fprintf (stderr, "dlopen (\"%s\"): %s\n", $LIBRPM_STRING, dlerror ()); -+ return 1; -+ } -+ rpmverp = dlsym (h, "RPMVERSION"); -+ if (!rpmverp) -+ { -+ fprintf (stderr, "dlsym (\"RPMVERSION\"): %s\n", dlerror ()); -+ return 1; -+ } -+ fprintf (stderr, "RPMVERSION is: \""); -+ fprintf (stderr, "%s\"\n", *rpmverp); -+ -+ /* Try to find the specific librpm version only for "librpm.so" as we do -+ not know how to assemble the version string otherwise. */ -+ -+ if (strcmp ("librpm.so", $LIBRPM_STRING) != 0) -+ { -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ else -+ { -+ char *h2_name; -+ void *h2; -+ int major, minor; -+ -+ if (sscanf (*rpmverp, "%d.%d", &major, &minor) != 2) -+ { -+ fprintf (stderr, "Unable to parse RPMVERSION.\n"); -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ /* Avoid the square brackets by malloc. */ -+ h2_name = malloc (64); -+ sprintf (h2_name, "librpm-%d.%d.so", major, minor); -+ h2 = dlopen (h2_name, RTLD_LAZY); -+ if (!h2) -+ { -+ fprintf (stderr, "dlopen (\"%s\"): %s\n", h2_name, dlerror ()); -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ if (h2 != h) -+ { -+ fprintf (stderr, "dlopen of \"%s\" and \"%s\" are different.\n", -+ $LIBRPM_STRING, h2_name); -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ /* Found the valid .so name with a specific version. */ -+ fprintf (f, "%s\n", h2_name); -+ return 0; -+ } -+ -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_run "$LINENO"; then : -+ -+ DLOPEN_LIBRPM="`cat conftest.out`" -+ if test "x$DLOPEN_LIBRPM" != "x"; then -+ HAVE_DLOPEN_LIBRPM=true -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLOPEN_LIBRPM" >&5 -+$as_echo "$DLOPEN_LIBRPM" >&6; } -+ fi -+ -+fi -+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ -+ conftest.$ac_objext conftest.beam conftest.$ac_ext -+fi -+ -+ rm -f conftest.out -+ -+ -+ -+ if $HAVE_DLOPEN_LIBRPM; then -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking rpm library API compatibility" >&5 -+$as_echo_n "checking rpm library API compatibility... " >&6; } -+ # The compilation requires -Werror to verify anything. -+ save_CFLAGS="$CFLAGS" -+ CFLAGS="$CFLAGS -Werror" -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+ -+/* Duplicate here the declarations to verify they match "elfread.c". */ -+#include <rpm/rpmlib.h> -+#include <rpm/rpmts.h> -+#include <rpm/rpmdb.h> -+#include <rpm/header.h> -+extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg); -+extern int rpmReadConfigFiles(const char * file, const char * target); -+extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi); -+extern Header rpmdbNextIterator(rpmdbMatchIterator mi); -+extern rpmts rpmtsCreate(void); -+extern rpmts rpmtsFree(rpmts ts); -+extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmTag rpmtag, -+ const void * keyp, size_t keylen); -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_compile "$LINENO"; then : -+ -+ LIBRPM_COMPAT=true -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -+$as_echo "yes" >&6; } -+ -+else -+ -+ LIBRPM_COMPAT=false -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+ -+fi -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ CFLAGS="$save_CFLAGS" -+ -+ if ! $LIBRPM_COMPAT; then -+ HAVE_DLOPEN_LIBRPM=false -+ fi -+ fi -+ -+ if $HAVE_DLOPEN_LIBRPM; then -+ DLOPEN_LIBRPM_STRING='"'"$DLOPEN_LIBRPM"'"' -+ -+cat >>confdefs.h <<_ACEOF -+#define DLOPEN_LIBRPM $DLOPEN_LIBRPM_STRING -+_ACEOF -+ -+ -+$as_echo "#define HAVE_LIBRPM 1" >>confdefs.h -+ -+ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+ LIBS="$save_LIBS" -+ if $DLOPEN_REQUIRE; then -+ as_fn_error "Specific name $LIBRPM was requested but it could not be opened." "$LINENO" 5 -+ fi -+ -+ -+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then -+ if test -n "$ac_tool_prefix"; then -+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. -+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } -+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : -+ $as_echo_n "(cached) " >&6 -+else -+ case $PKG_CONFIG in -+ [\\/]* | ?:[\\/]*) -+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. -+ ;; -+ *) -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+ done -+IFS=$as_save_IFS -+ -+ ;; -+esac -+fi -+PKG_CONFIG=$ac_cv_path_PKG_CONFIG -+if test -n "$PKG_CONFIG"; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 -+$as_echo "$PKG_CONFIG" >&6; } -+else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+fi -+ -+ -+fi -+if test -z "$ac_cv_path_PKG_CONFIG"; then -+ ac_pt_PKG_CONFIG=$PKG_CONFIG -+ # Extract the first word of "pkg-config", so it can be a program name with args. -+set dummy pkg-config; ac_word=$2 -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } -+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : -+ $as_echo_n "(cached) " >&6 -+else -+ case $ac_pt_PKG_CONFIG in -+ [\\/]* | ?:[\\/]*) -+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. -+ ;; -+ *) -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+ done -+IFS=$as_save_IFS -+ -+ ;; -+esac -+fi -+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG -+if test -n "$ac_pt_PKG_CONFIG"; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 -+$as_echo "$ac_pt_PKG_CONFIG" >&6; } -+else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+fi -+ -+ if test "x$ac_pt_PKG_CONFIG" = x; then -+ PKG_CONFIG="" -+ else -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -+ac_tool_warned=yes ;; -+esac -+ PKG_CONFIG=$ac_pt_PKG_CONFIG -+ fi -+else -+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG" -+fi -+ -+fi -+if test -n "$PKG_CONFIG"; then -+ _pkg_min_version=0.9.0 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 -+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } -+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -+$as_echo "yes" >&6; } -+ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+ PKG_CONFIG="" -+ fi -+ -+fi -+ -+pkg_failed=no -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for RPM" >&5 -+$as_echo_n "checking for RPM... " >&6; } -+ -+if test -n "$RPM_CFLAGS"; then -+ pkg_cv_RPM_CFLAGS="$RPM_CFLAGS" -+ elif test -n "$PKG_CONFIG"; then -+ if test -n "$PKG_CONFIG" && \ -+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"rpm\""; } >&5 -+ ($PKG_CONFIG --exists --print-errors "rpm") 2>&5 -+ ac_status=$? -+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -+ test $ac_status = 0; }; then -+ pkg_cv_RPM_CFLAGS=`$PKG_CONFIG --cflags "rpm" 2>/dev/null` -+else -+ pkg_failed=yes -+fi -+ else -+ pkg_failed=untried -+fi -+if test -n "$RPM_LIBS"; then -+ pkg_cv_RPM_LIBS="$RPM_LIBS" -+ elif test -n "$PKG_CONFIG"; then -+ if test -n "$PKG_CONFIG" && \ -+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"rpm\""; } >&5 -+ ($PKG_CONFIG --exists --print-errors "rpm") 2>&5 -+ ac_status=$? -+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -+ test $ac_status = 0; }; then -+ pkg_cv_RPM_LIBS=`$PKG_CONFIG --libs "rpm" 2>/dev/null` -+else -+ pkg_failed=yes -+fi -+ else -+ pkg_failed=untried -+fi -+ -+ -+ -+if test $pkg_failed = yes; then -+ -+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then -+ _pkg_short_errors_supported=yes -+else -+ _pkg_short_errors_supported=no -+fi -+ if test $_pkg_short_errors_supported = yes; then -+ RPM_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "rpm" 2>&1` -+ else -+ RPM_PKG_ERRORS=`$PKG_CONFIG --print-errors "rpm" 2>&1` -+ fi -+ # Put the nasty error message in config.log where it belongs -+ echo "$RPM_PKG_ERRORS" >&5 -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+ HAVE_LIBRPM=false -+elif test $pkg_failed = untried; then -+ HAVE_LIBRPM=false -+else -+ RPM_CFLAGS=$pkg_cv_RPM_CFLAGS -+ RPM_LIBS=$pkg_cv_RPM_LIBS -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -+$as_echo "yes" >&6; } -+ HAVE_LIBRPM=true -+fi -+ -+ if $HAVE_LIBRPM; then -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking rpm library API compatibility" >&5 -+$as_echo_n "checking rpm library API compatibility... " >&6; } -+ # The compilation requires -Werror to verify anything. -+ save_CFLAGS="$CFLAGS" -+ CFLAGS="$CFLAGS -Werror" -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+ -+/* Duplicate here the declarations to verify they match "elfread.c". */ -+#include <rpm/rpmlib.h> -+#include <rpm/rpmts.h> -+#include <rpm/rpmdb.h> -+#include <rpm/header.h> -+extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg); -+extern int rpmReadConfigFiles(const char * file, const char * target); -+extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi); -+extern Header rpmdbNextIterator(rpmdbMatchIterator mi); -+extern rpmts rpmtsCreate(void); -+extern rpmts rpmtsFree(rpmts ts); -+extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmTag rpmtag, -+ const void * keyp, size_t keylen); -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_compile "$LINENO"; then : -+ -+ LIBRPM_COMPAT=true -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -+$as_echo "yes" >&6; } -+ -+else -+ -+ LIBRPM_COMPAT=false -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+ -+fi -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ CFLAGS="$save_CFLAGS" -+ -+ if ! $LIBRPM_COMPAT; then -+ HAVE_LIBRPM=false -+ RPM_PKG_ERRORS="Found $LIBRPM API is incompatibile with this GDB" -+ fi -+ fi -+ -+ if $HAVE_LIBRPM; then -+ -+$as_echo "#define HAVE_LIBRPM 1" >>confdefs.h -+ -+ CFLAGS="$CFLAGS $RPM_CFLAGS" -+ LIBS="$LIBS $RPM_LIBS" -+ else -+ if $RPM_REQUIRE; then -+ as_fn_error "$RPM_PKG_ERRORS" "$LINENO" 5 -+ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $RPM_PKG_ERRORS" >&5 -+$as_echo "$as_me: WARNING: $RPM_PKG_ERRORS" >&2;} -+ fi -+ fi -+ fi -+fi -+ - - - subdirs="$subdirs testsuite" -diff -rup gdb-7.4ori//gdb/configure.ac gdb-7.4/gdb/configure.ac ---- gdb-7.4ori//gdb/configure.ac 2012-01-06 05:43:06.000000000 +0100 -+++ gdb-7.4/gdb/configure.ac 2012-05-10 11:26:26.319643428 +0200 -@@ -138,6 +138,199 @@ AS_HELP_STRING([--with-relocated-sources - [Relocated directory for source files. ]) - ]) - -+# Integration with rpm library to support missing debuginfo suggestions. -+# --without-rpm: Disable any rpm support. -+# --with-rpm=libname.so: Try to dynamically open `libname.so' during runtime. -+# Even with runtime missing `libname.so' GDB will still other run correctly. -+# Missing `libname.so' during ./configure will abort the configuration. -+# --with-rpm=librpm.so: Like `--with-rpm=libname.so' but try to find specific -+# minor version first such as `librpm-4.6.so' as minor version differences -+# mean API+ABI incompatibility. If the specific match versioned library name -+# could not be found still open dynamically at least `librpm.so'. -+# --with-rpm: Like `--with-rpm=librpm.so' but if any of its detection fails try -+# to find librpm for compilation-time linking by pkg-config. GDB binary will -+# be probably linked with the version specific library (as `librpm-4.6.so'). -+# Failure to find librpm by pkg-config will abort the configuration. -+# (default) --with-rpm=auto: Like `--with-rpm=librpm.so' but if even pkg-config -+# cannot find librpm use to the rpmless compilation (like `--without-rpm'). -+ -+AC_ARG_WITH([rpm], -+ [AS_HELP_STRING([--with-rpm], -+ [query rpm database for missing debuginfos (yes/no, def. auto=librpm.so)])], [], [with_rpm="auto"]) -+ -+m4_pattern_allow([^AC_MSG_ERROR$]) -+m4_pattern_allow([^AC_MSG_WARN$]) -+if test "x$with_rpm" != "xno"; then -+ if test "x$with_rpm" = "xyes"; then -+ LIBRPM="librpm.so" -+ RPM_REQUIRE=true -+ DLOPEN_REQUIRE=false -+ elif test "x$with_rpm" = "xauto"; then -+ LIBRPM="librpm.so" -+ RPM_REQUIRE=false -+ DLOPEN_REQUIRE=false -+ else -+ LIBRPM="$with_rpm" -+ RPM_REQUIRE=true -+ DLOPEN_REQUIRE=true -+ fi -+ LIBRPM_STRING='"'"$LIBRPM"'"' -+ -+ AC_MSG_CHECKING([specific librpm version]) -+ HAVE_DLOPEN_LIBRPM=false -+ save_LIBS="$LIBS" -+ LIBS="$LIBS -ldl" -+ AC_RUN_IFELSE(AC_LANG_PROGRAM([[ -+#include <rpm/rpmlib.h> -+#include <dlfcn.h> -+#include <errno.h> -+ ]], [[ -+ void *h; -+ const char *const *rpmverp; -+ FILE *f; -+ -+ f = fopen ("conftest.out", "w"); -+ if (!f) -+ { -+ fprintf (stderr, "Cannot write \"%s\": %s\n", "conftest.out", -+ strerror (errno)); -+ return 1; -+ } -+ h = dlopen ($LIBRPM_STRING, RTLD_LAZY); -+ if (!h) -+ { -+ fprintf (stderr, "dlopen (\"%s\"): %s\n", $LIBRPM_STRING, dlerror ()); -+ return 1; -+ } -+ rpmverp = dlsym (h, "RPMVERSION"); -+ if (!rpmverp) -+ { -+ fprintf (stderr, "dlsym (\"RPMVERSION\"): %s\n", dlerror ()); -+ return 1; -+ } -+ fprintf (stderr, "RPMVERSION is: \""); -+ fprintf (stderr, "%s\"\n", *rpmverp); -+ -+ /* Try to find the specific librpm version only for "librpm.so" as we do -+ not know how to assemble the version string otherwise. */ -+ -+ if (strcmp ("librpm.so", $LIBRPM_STRING) != 0) -+ { -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ else -+ { -+ char *h2_name; -+ void *h2; -+ int major, minor; -+ -+ if (sscanf (*rpmverp, "%d.%d", &major, &minor) != 2) -+ { -+ fprintf (stderr, "Unable to parse RPMVERSION.\n"); -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ /* Avoid the square brackets by malloc. */ -+ h2_name = malloc (64); -+ sprintf (h2_name, "librpm-%d.%d.so", major, minor); -+ h2 = dlopen (h2_name, RTLD_LAZY); -+ if (!h2) -+ { -+ fprintf (stderr, "dlopen (\"%s\"): %s\n", h2_name, dlerror ()); -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ if (h2 != h) -+ { -+ fprintf (stderr, "dlopen of \"%s\" and \"%s\" are different.\n", -+ $LIBRPM_STRING, h2_name); -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ /* Found the valid .so name with a specific version. */ -+ fprintf (f, "%s\n", h2_name); -+ return 0; -+ } -+ ]]), [ -+ DLOPEN_LIBRPM="`cat conftest.out`" -+ if test "x$DLOPEN_LIBRPM" != "x"; then -+ HAVE_DLOPEN_LIBRPM=true -+ AC_MSG_RESULT($DLOPEN_LIBRPM) -+ fi -+ ]) -+ rm -f conftest.out -+ -+ m4_define([CHECK_LIBRPM_COMPAT], [ -+ AC_MSG_CHECKING([rpm library API compatibility]) -+ # The compilation requires -Werror to verify anything. -+ save_CFLAGS="$CFLAGS" -+ CFLAGS="$CFLAGS -Werror" -+ AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[ -+/* Duplicate here the declarations to verify they match "elfread.c". */ -+#include <rpm/rpmlib.h> -+#include <rpm/rpmts.h> -+#include <rpm/rpmdb.h> -+#include <rpm/header.h> -+extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg); -+extern int rpmReadConfigFiles(const char * file, const char * target); -+extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi); -+extern Header rpmdbNextIterator(rpmdbMatchIterator mi); -+extern rpmts rpmtsCreate(void); -+extern rpmts rpmtsFree(rpmts ts); -+extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmTag rpmtag, -+ const void * keyp, size_t keylen); -+ ]]), [ -+ LIBRPM_COMPAT=true -+ AC_MSG_RESULT(yes) -+ ], [ -+ LIBRPM_COMPAT=false -+ AC_MSG_RESULT(no) -+ ]) -+ CFLAGS="$save_CFLAGS" -+ ]) -+ -+ if $HAVE_DLOPEN_LIBRPM; then -+ CHECK_LIBRPM_COMPAT -+ if ! $LIBRPM_COMPAT; then -+ HAVE_DLOPEN_LIBRPM=false -+ fi -+ fi -+ -+ if $HAVE_DLOPEN_LIBRPM; then -+ DLOPEN_LIBRPM_STRING='"'"$DLOPEN_LIBRPM"'"' -+ AC_DEFINE_UNQUOTED(DLOPEN_LIBRPM, $DLOPEN_LIBRPM_STRING, [librpm version specific library name to dlopen.]) -+ AC_DEFINE(HAVE_LIBRPM, 1, [Define if librpm library is being used.]) -+ else -+ AC_MSG_RESULT(no) -+ LIBS="$save_LIBS" -+ if $DLOPEN_REQUIRE; then -+ AC_MSG_ERROR([Specific name $LIBRPM was requested but it could not be opened.]) -+ fi -+ PKG_CHECK_MODULES(RPM, rpm, [HAVE_LIBRPM=true], [HAVE_LIBRPM=false]) -+ -+ if $HAVE_LIBRPM; then -+ CHECK_LIBRPM_COMPAT -+ if ! $LIBRPM_COMPAT; then -+ HAVE_LIBRPM=false -+ RPM_PKG_ERRORS="Found $LIBRPM API is incompatibile with this GDB" -+ fi -+ fi -+ -+ if $HAVE_LIBRPM; then -+ AC_DEFINE(HAVE_LIBRPM, 1, [Define if librpm library is being used.]) -+ CFLAGS="$CFLAGS $RPM_CFLAGS" -+ LIBS="$LIBS $RPM_LIBS" -+ else -+ if $RPM_REQUIRE; then -+ AC_MSG_ERROR($RPM_PKG_ERRORS) -+ else -+ AC_MSG_WARN($RPM_PKG_ERRORS) -+ fi -+ fi -+ fi -+fi -+ - AC_CONFIG_SUBDIRS(testsuite) - - # Check whether to support alternative target configurations -diff -rup gdb-7.4ori//gdb/corelow.c gdb-7.4/gdb/corelow.c ---- gdb-7.4ori//gdb/corelow.c 2012-01-06 05:43:06.000000000 +0100 -+++ gdb-7.4/gdb/corelow.c 2012-05-10 11:26:26.319643428 +0200 -@@ -47,7 +47,9 @@ - #include "progspace.h" - #include "objfiles.h" - #include "wrapper.h" -- -+#include "auxv.h" -+#include "elf/common.h" -+#include "gdbcmd.h" - - #ifndef O_LARGEFILE - #define O_LARGEFILE 0 -@@ -278,6 +280,52 @@ add_to_thread_list (bfd *abfd, asection - inferior_ptid = ptid; /* Yes, make it current. */ - } - -+static int build_id_core_loads = 1; -+ -+static void -+build_id_locate_exec (int from_tty) -+{ -+ CORE_ADDR at_entry; -+ struct build_id *build_id; -+ char *exec_filename, *debug_filename; -+ char *build_id_filename; -+ struct cleanup *back_to; -+ -+ if (exec_bfd != NULL || symfile_objfile != NULL) -+ return; -+ -+ if (target_auxv_search (¤t_target, AT_ENTRY, &at_entry) <= 0) -+ return; -+ -+ build_id = build_id_addr_get (at_entry); -+ if (build_id == NULL) -+ return; -+ -+ /* SYMFILE_OBJFILE should refer to the main executable (not only to its -+ separate debug info file). gcc44+ keeps .eh_frame only in the main -+ executable without its duplicate .debug_frame in the separate debug info -+ file - such .eh_frame would not be found if SYMFILE_OBJFILE would refer -+ directly to the separate debug info file. */ -+ -+ exec_filename = build_id_to_filename (build_id, &build_id_filename, 0); -+ back_to = make_cleanup (xfree, build_id_filename); -+ -+ if (exec_filename != NULL) -+ { -+ make_cleanup (xfree, exec_filename); -+ exec_file_attach (exec_filename, from_tty); -+ symbol_file_add_main (exec_filename, from_tty); -+ if (symfile_objfile != NULL) -+ symfile_objfile->flags |= OBJF_BUILD_ID_CORE_LOADED; -+ } -+ else -+ debug_print_missing (BUILD_ID_MAIN_EXECUTABLE_FILENAME, build_id_filename); -+ -+ do_cleanups (back_to); -+ -+ /* No automatic SOLIB_ADD as the libraries would get read twice. */ -+} -+ - /* This routine opens and sets up the core file bfd. */ - - static void -@@ -379,6 +427,12 @@ core_open (char *filename, int from_tty) - push_target (&core_ops); - discard_cleanups (old_chain); - -+ /* Find the build_id identifiers. If it gets executed after -+ POST_CREATE_INFERIOR we would clash with asking to discard the already -+ loaded VDSO symbols. */ -+ if (build_id_core_loads != 0) -+ build_id_locate_exec (from_tty); -+ - /* Do this before acknowledging the inferior, so if - post_create_inferior throws (can happen easilly if you're loading - a core file with the wrong exec), we aren't left with threads -@@ -932,4 +986,11 @@ _initialize_corelow (void) - init_core_ops (); - - add_target (&core_ops); -+ -+ add_setshow_boolean_cmd ("build-id-core-loads", class_files, -+ &build_id_core_loads, _("\ -+Set whether CORE-FILE loads the build-id associated files automatically."), _("\ -+Show whether CORE-FILE loads the build-id associated files automatically.."), -+ NULL, NULL, NULL, -+ &setlist, &showlist); - } -diff -rup gdb-7.4ori//gdb/doc/gdb.texinfo gdb-7.4/gdb/doc/gdb.texinfo ---- gdb-7.4ori//gdb/doc/gdb.texinfo 2012-01-06 05:43:35.000000000 +0100 -+++ gdb-7.4/gdb/doc/gdb.texinfo 2012-05-10 11:10:37.455644929 +0200 -@@ -15872,6 +15872,27 @@ information files. - - @end table - -+You can also adjust the current verbosity of the @dfn{build id} locating. -+ -+@table @code -+ -+@kindex set build-id-verbose -+@item set build-id-verbose 0 -+No additional messages are printed. -+ -+@item set build-id-verbose 1 -+Missing separate debug filenames are printed. -+ -+@item set build-id-verbose 2 -+Missing separate debug filenames are printed and also all the parsing of the -+binaries to find their @dfn{build id} content is printed. -+ -+@kindex show build-id-verbose -+@item show build-id-verbose -+Show the current verbosity value for the @dfn{build id} content locating. -+ -+@end table -+ - @cindex @code{.gnu_debuglink} sections - @cindex debug link sections - A debug link is a special section of the executable file named -diff -rup gdb-7.4ori//gdb/elfread.c gdb-7.4/gdb/elfread.c ---- gdb-7.4ori//gdb/elfread.c 2012-01-06 05:43:11.000000000 +0100 -+++ gdb-7.4/gdb/elfread.c 2012-05-10 11:27:18.443643345 +0200 -@@ -41,6 +41,12 @@ - #include "infcall.h" - #include "gdbthread.h" - #include "regcache.h" -+#include "libbfd.h" -+#include "gdbcore.h" -+#include "gdbcmd.h" -+#include "observer.h" -+#include "elf/external.h" -+#include <sys/stat.h> - - extern void _initialize_elfread (void); - -@@ -1042,16 +1048,65 @@ elf_gnu_ifunc_resolver_return_stop (stru - update_breakpoint_locations (b, sals, sals_end); - } - -+#define BUILD_ID_VERBOSE_NONE 0 -+#define BUILD_ID_VERBOSE_FILENAMES 1 -+#define BUILD_ID_VERBOSE_BINARY_PARSE 2 -+static int build_id_verbose = BUILD_ID_VERBOSE_FILENAMES; -+static void -+show_build_id_verbose (struct ui_file *file, int from_tty, -+ struct cmd_list_element *c, const char *value) -+{ -+ fprintf_filtered (file, _("Verbosity level of the build-id locator is %s.\n"), -+ value); -+} -+ - struct build_id - { - size_t size; - gdb_byte data[1]; - }; - --/* Locate NT_GNU_BUILD_ID from ABFD and return its content. */ -+/* Locate NT_GNU_BUILD_ID and return its matching debug filename. -+ FIXME: NOTE decoding should be unified with the BFD core notes decoding. */ -+ -+struct build_id * -+build_id_buf_get (bfd *templ, gdb_byte *buf, bfd_size_type size) -+{ -+ bfd_byte *p; -+ -+ p = buf; -+ while (p < buf + size) -+ { -+ /* FIXME: bad alignment assumption. */ -+ Elf_External_Note *xnp = (Elf_External_Note *) p; -+ size_t namesz = H_GET_32 (templ, xnp->namesz); -+ size_t descsz = H_GET_32 (templ, xnp->descsz); -+ bfd_byte *descdata = xnp->name + BFD_ALIGN (namesz, 4); -+ -+ if (H_GET_32 (templ, xnp->type) == NT_GNU_BUILD_ID -+ && namesz == sizeof "GNU" -+ && memcmp (xnp->name, "GNU", sizeof "GNU") == 0) -+ { -+ size_t size = descsz; -+ gdb_byte *data = (void *) descdata; -+ struct build_id *retval; -+ -+ retval = xmalloc (sizeof *retval - 1 + size); -+ retval->size = size; -+ memcpy (retval->data, data, size); -+ -+ return retval; -+ } -+ p = descdata + BFD_ALIGN (descsz, 4); -+ } -+ return NULL; -+} -+ -+/* Separate debuginfo files have corrupted PHDR but SHDR is correct there. -+ Locate NT_GNU_BUILD_ID from ABFD and return its content. */ - - static struct build_id * --build_id_bfd_get (bfd *abfd) -+build_id_bfd_shdr_get (bfd *abfd) - { - struct build_id *retval; - -@@ -1067,6 +1122,348 @@ build_id_bfd_get (bfd *abfd) - return retval; - } - -+/* Core files may have missing (corrupt) SHDR but PDHR is correct there. -+ bfd_elf_bfd_from_remote_memory () has too much overhead by -+ allocating/reading all the available ELF PT_LOADs. */ -+ -+static struct build_id * -+build_id_phdr_get (bfd *templ, bfd_vma loadbase, unsigned e_phnum, -+ Elf_Internal_Phdr *i_phdr) -+{ -+ int i; -+ struct build_id *retval = NULL; -+ -+ for (i = 0; i < e_phnum; i++) -+ if (i_phdr[i].p_type == PT_NOTE && i_phdr[i].p_filesz > 0) -+ { -+ Elf_Internal_Phdr *hdr = &i_phdr[i]; -+ gdb_byte *buf; -+ int err; -+ -+ buf = xmalloc (hdr->p_filesz); -+ err = target_read_memory (loadbase + i_phdr[i].p_vaddr, buf, -+ hdr->p_filesz); -+ if (err == 0) -+ retval = build_id_buf_get (templ, buf, hdr->p_filesz); -+ else -+ retval = NULL; -+ xfree (buf); -+ if (retval != NULL) -+ break; -+ } -+ return retval; -+} -+ -+/* First we validate the file by reading in the ELF header and checking -+ the magic number. */ -+ -+static inline bfd_boolean -+elf_file_p (Elf64_External_Ehdr *x_ehdrp64) -+{ -+ gdb_assert (sizeof (Elf64_External_Ehdr) >= sizeof (Elf32_External_Ehdr)); -+ gdb_assert (offsetof (Elf64_External_Ehdr, e_ident) -+ == offsetof (Elf32_External_Ehdr, e_ident)); -+ gdb_assert (sizeof (((Elf64_External_Ehdr *) 0)->e_ident) -+ == sizeof (((Elf32_External_Ehdr *) 0)->e_ident)); -+ -+ return ((x_ehdrp64->e_ident[EI_MAG0] == ELFMAG0) -+ && (x_ehdrp64->e_ident[EI_MAG1] == ELFMAG1) -+ && (x_ehdrp64->e_ident[EI_MAG2] == ELFMAG2) -+ && (x_ehdrp64->e_ident[EI_MAG3] == ELFMAG3)); -+} -+ -+/* Translate an ELF file header in external format into an ELF file header in -+ internal format. */ -+ -+#define H_GET_WORD(bfd, ptr) (is64 ? H_GET_64 (bfd, (ptr)) \ -+ : H_GET_32 (bfd, (ptr))) -+#define H_GET_SIGNED_WORD(bfd, ptr) (is64 ? H_GET_S64 (bfd, (ptr)) \ -+ : H_GET_S32 (bfd, (ptr))) -+ -+static void -+elf_swap_ehdr_in (bfd *abfd, -+ const Elf64_External_Ehdr *src64, -+ Elf_Internal_Ehdr *dst) -+{ -+ int is64 = bfd_get_arch_size (abfd) == 64; -+#define SRC(field) (is64 ? src64->field \ -+ : ((const Elf32_External_Ehdr *) src64)->field) -+ -+ int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma; -+ memcpy (dst->e_ident, SRC (e_ident), EI_NIDENT); -+ dst->e_type = H_GET_16 (abfd, SRC (e_type)); -+ dst->e_machine = H_GET_16 (abfd, SRC (e_machine)); -+ dst->e_version = H_GET_32 (abfd, SRC (e_version)); -+ if (signed_vma) -+ dst->e_entry = H_GET_SIGNED_WORD (abfd, SRC (e_entry)); -+ else -+ dst->e_entry = H_GET_WORD (abfd, SRC (e_entry)); -+ dst->e_phoff = H_GET_WORD (abfd, SRC (e_phoff)); -+ dst->e_shoff = H_GET_WORD (abfd, SRC (e_shoff)); -+ dst->e_flags = H_GET_32 (abfd, SRC (e_flags)); -+ dst->e_ehsize = H_GET_16 (abfd, SRC (e_ehsize)); -+ dst->e_phentsize = H_GET_16 (abfd, SRC (e_phentsize)); -+ dst->e_phnum = H_GET_16 (abfd, SRC (e_phnum)); -+ dst->e_shentsize = H_GET_16 (abfd, SRC (e_shentsize)); -+ dst->e_shnum = H_GET_16 (abfd, SRC (e_shnum)); -+ dst->e_shstrndx = H_GET_16 (abfd, SRC (e_shstrndx)); -+ -+#undef SRC -+} -+ -+/* Translate an ELF program header table entry in external format into an -+ ELF program header table entry in internal format. */ -+ -+void -+elf_swap_phdr_in (bfd *abfd, -+ const Elf64_External_Phdr *src64, -+ Elf_Internal_Phdr *dst) -+{ -+ int is64 = bfd_get_arch_size (abfd) == 64; -+#define SRC(field) (is64 ? src64->field \ -+ : ((const Elf32_External_Phdr *) src64)->field) -+ -+ int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma; -+ -+ dst->p_type = H_GET_32 (abfd, SRC (p_type)); -+ dst->p_flags = H_GET_32 (abfd, SRC (p_flags)); -+ dst->p_offset = H_GET_WORD (abfd, SRC (p_offset)); -+ if (signed_vma) -+ { -+ dst->p_vaddr = H_GET_SIGNED_WORD (abfd, SRC (p_vaddr)); -+ dst->p_paddr = H_GET_SIGNED_WORD (abfd, SRC (p_paddr)); -+ } -+ else -+ { -+ dst->p_vaddr = H_GET_WORD (abfd, SRC (p_vaddr)); -+ dst->p_paddr = H_GET_WORD (abfd, SRC (p_paddr)); -+ } -+ dst->p_filesz = H_GET_WORD (abfd, SRC (p_filesz)); -+ dst->p_memsz = H_GET_WORD (abfd, SRC (p_memsz)); -+ dst->p_align = H_GET_WORD (abfd, SRC (p_align)); -+ -+#undef SRC -+} -+ -+#undef H_GET_SIGNED_WORD -+#undef H_GET_WORD -+ -+static Elf_Internal_Phdr * -+elf_get_phdr (bfd *templ, bfd_vma ehdr_vma, unsigned *e_phnum_pointer, -+ bfd_vma *loadbase_pointer) -+{ -+ /* sizeof (Elf64_External_Ehdr) >= sizeof (Elf32_External_Ehdr) */ -+ Elf64_External_Ehdr x_ehdr64; /* Elf file header, external form */ -+ Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */ -+ bfd_size_type x_phdrs_size; -+ gdb_byte *x_phdrs_ptr; -+ Elf_Internal_Phdr *i_phdrs; -+ int err; -+ unsigned int i; -+ bfd_vma loadbase; -+ int loadbase_set; -+ -+ gdb_assert (templ != NULL); -+ gdb_assert (sizeof (Elf64_External_Ehdr) >= sizeof (Elf32_External_Ehdr)); -+ -+ /* Read in the ELF header in external format. */ -+ err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr64, sizeof x_ehdr64); -+ if (err) -+ { -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Error reading ELF header at address 0x%lx"), -+ (unsigned long) ehdr_vma); -+ return NULL; -+ } -+ -+ /* Now check to see if we have a valid ELF file, and one that BFD can -+ make use of. The magic number must match, the address size ('class') -+ and byte-swapping must match our XVEC entry. */ -+ -+ if (! elf_file_p (&x_ehdr64) -+ || x_ehdr64.e_ident[EI_VERSION] != EV_CURRENT -+ || !((bfd_get_arch_size (templ) == 64 -+ && x_ehdr64.e_ident[EI_CLASS] == ELFCLASS64) -+ || (bfd_get_arch_size (templ) == 32 -+ && x_ehdr64.e_ident[EI_CLASS] == ELFCLASS32))) -+ { -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Unrecognized ELF header at address 0x%lx"), -+ (unsigned long) ehdr_vma); -+ return NULL; -+ } -+ -+ /* Check that file's byte order matches xvec's */ -+ switch (x_ehdr64.e_ident[EI_DATA]) -+ { -+ case ELFDATA2MSB: /* Big-endian */ -+ if (! bfd_header_big_endian (templ)) -+ { -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Unrecognized " -+ "big-endian ELF header at address 0x%lx"), -+ (unsigned long) ehdr_vma); -+ return NULL; -+ } -+ break; -+ case ELFDATA2LSB: /* Little-endian */ -+ if (! bfd_header_little_endian (templ)) -+ { -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Unrecognized " -+ "little-endian ELF header at address 0x%lx"), -+ (unsigned long) ehdr_vma); -+ return NULL; -+ } -+ break; -+ case ELFDATANONE: /* No data encoding specified */ -+ default: /* Unknown data encoding specified */ -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Unrecognized " -+ "ELF header endianity at address 0x%lx"), -+ (unsigned long) ehdr_vma); -+ return NULL; -+ } -+ -+ elf_swap_ehdr_in (templ, &x_ehdr64, &i_ehdr); -+ -+ /* The file header tells where to find the program headers. -+ These are what we use to actually choose what to read. */ -+ -+ if (i_ehdr.e_phentsize != (bfd_get_arch_size (templ) == 64 -+ ? sizeof (Elf64_External_Phdr) -+ : sizeof (Elf32_External_Phdr)) -+ || i_ehdr.e_phnum == 0) -+ { -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Invalid ELF program headers from the ELF header " -+ "at address 0x%lx"), (unsigned long) ehdr_vma); -+ return NULL; -+ } -+ -+ x_phdrs_size = (bfd_get_arch_size (templ) == 64 ? sizeof (Elf64_External_Phdr) -+ : sizeof (Elf32_External_Phdr)); -+ -+ i_phdrs = xmalloc (i_ehdr.e_phnum * (sizeof *i_phdrs + x_phdrs_size)); -+ x_phdrs_ptr = (void *) &i_phdrs[i_ehdr.e_phnum]; -+ err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs_ptr, -+ i_ehdr.e_phnum * x_phdrs_size); -+ if (err) -+ { -+ free (i_phdrs); -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Error reading " -+ "ELF program headers at address 0x%lx"), -+ (unsigned long) (ehdr_vma + i_ehdr.e_phoff)); -+ return NULL; -+ } -+ -+ loadbase = ehdr_vma; -+ loadbase_set = 0; -+ for (i = 0; i < i_ehdr.e_phnum; ++i) -+ { -+ elf_swap_phdr_in (templ, (Elf64_External_Phdr *) -+ (x_phdrs_ptr + i * x_phdrs_size), &i_phdrs[i]); -+ /* IA-64 vDSO may have two mappings for one segment, where one mapping -+ is executable only, and one is read only. We must not use the -+ executable one (PF_R is the first one, PF_X the second one). */ -+ if (i_phdrs[i].p_type == PT_LOAD && (i_phdrs[i].p_flags & PF_R)) -+ { -+ /* Only the first PT_LOAD segment indicates the file bias. -+ Next segments may have P_VADDR arbitrarily higher. -+ If the first segment has P_VADDR zero any next segment must not -+ confuse us, the first one sets LOADBASE certainly enough. */ -+ if (!loadbase_set && i_phdrs[i].p_offset == 0) -+ { -+ loadbase = ehdr_vma - i_phdrs[i].p_vaddr; -+ loadbase_set = 1; -+ } -+ } -+ } -+ -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Found ELF header at address 0x%lx, loadbase 0x%lx"), -+ (unsigned long) ehdr_vma, (unsigned long) loadbase); -+ -+ *e_phnum_pointer = i_ehdr.e_phnum; -+ *loadbase_pointer = loadbase; -+ return i_phdrs; -+} -+ -+/* BUILD_ID_ADDR_GET gets ADDR located somewhere in the object. -+ Find the first section before ADDR containing an ELF header. -+ We rely on the fact the sections from multiple files do not mix. -+ FIXME: We should check ADDR is contained _inside_ the section with possibly -+ missing content (P_FILESZ < P_MEMSZ). These omitted sections are currently -+ hidden by _BFD_ELF_MAKE_SECTION_FROM_PHDR. */ -+ -+static CORE_ADDR build_id_addr; -+struct build_id_addr_sect -+ { -+ struct build_id_addr_sect *next; -+ asection *sect; -+ }; -+static struct build_id_addr_sect *build_id_addr_sect; -+ -+static void build_id_addr_candidate (bfd *abfd, asection *sect, void *obj) -+{ -+ if (build_id_addr >= bfd_section_vma (abfd, sect)) -+ { -+ struct build_id_addr_sect *candidate; -+ -+ candidate = xmalloc (sizeof *candidate); -+ candidate->next = build_id_addr_sect; -+ build_id_addr_sect = candidate; -+ candidate->sect = sect; -+ } -+} -+ -+struct build_id * -+build_id_addr_get (CORE_ADDR addr) -+{ -+ struct build_id_addr_sect *candidate; -+ struct build_id *retval = NULL; -+ Elf_Internal_Phdr *i_phdr = NULL; -+ bfd_vma loadbase = 0; -+ unsigned e_phnum = 0; -+ -+ if (core_bfd == NULL) -+ return NULL; -+ -+ build_id_addr = addr; -+ gdb_assert (build_id_addr_sect == NULL); -+ bfd_map_over_sections (core_bfd, build_id_addr_candidate, NULL); -+ -+ /* Sections are sorted in the high-to-low VMAs order. -+ Stop the search on the first ELF header we find. -+ Do not continue the search even if it does not contain NT_GNU_BUILD_ID. */ -+ -+ for (candidate = build_id_addr_sect; candidate != NULL; -+ candidate = candidate->next) -+ { -+ i_phdr = elf_get_phdr (core_bfd, -+ bfd_section_vma (core_bfd, candidate->sect), -+ &e_phnum, &loadbase); -+ if (i_phdr != NULL) -+ break; -+ } -+ -+ if (i_phdr != NULL) -+ { -+ retval = build_id_phdr_get (core_bfd, loadbase, e_phnum, i_phdr); -+ xfree (i_phdr); -+ } -+ -+ while (build_id_addr_sect != NULL) -+ { -+ candidate = build_id_addr_sect; -+ build_id_addr_sect = candidate->next; -+ xfree (candidate); -+ } -+ -+ return retval; -+} -+ - /* Return if FILENAME has NT_GNU_BUILD_ID matching the CHECK value. */ - - static int -@@ -1081,7 +1478,7 @@ build_id_verify (const char *filename, s - if (abfd == NULL) - return 0; - -- found = build_id_bfd_get (abfd); -+ found = build_id_bfd_shdr_get (abfd); - - if (found == NULL) - warning (_("File \"%s\" has no build-id, file skipped"), filename); -@@ -1099,14 +1496,15 @@ build_id_verify (const char *filename, s - return retval; - } - --static char * --build_id_to_debug_filename (struct build_id *build_id) -+char * -+build_id_to_filename (struct build_id *build_id, char **link_return, -+ int add_debug_suffix) - { - char *link, *debugdir, *retval = NULL; -+ char *link_all = NULL; - - /* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */ -- link = alloca (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1 -- + 2 * build_id->size + (sizeof ".debug" - 1) + 1); -+ link = xmalloc (strlen (debug_file_directory) + 2 * build_id->size + 50); - - /* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will - cause "/.build-id/..." lookups. */ -@@ -1117,6 +1515,8 @@ build_id_to_debug_filename (struct build - char *s, *debugdir_end; - gdb_byte *data = build_id->data; - size_t size = build_id->size; -+ unsigned seqno; -+ struct stat statbuf_trash; - - while (*debugdir == DIRNAME_SEPARATOR) - debugdir++; -@@ -1137,39 +1537,637 @@ build_id_to_debug_filename (struct build - *s++ = '/'; - while (size-- > 0) - s += sprintf (s, "%02x", (unsigned) *data++); -- strcpy (s, ".debug"); -- -- /* lrealpath() is expensive even for the usually non-existent files. */ -- if (access (link, F_OK) == 0) -- retval = lrealpath (link); - -- if (retval != NULL && !build_id_verify (retval, build_id)) -+ for (seqno = 0;; seqno++) - { -- xfree (retval); -- retval = NULL; -+ char *s2; -+ -+ if (seqno) -+ { -+ /* There can be multiple build-id symlinks pointing to real files -+ with the same build-id (such as hard links). Some of the real -+ files may not be installed. */ -+ -+ s2 = s + sprintf (s, ".%u", seqno); -+ } -+ else -+ s2 = s; -+ -+ if (add_debug_suffix) -+ strcpy (s2, ".debug"); -+ else -+ *s2 = 0; -+ -+ /* `access' automatically dereferences LINK. */ -+ if (lstat (link, &statbuf_trash) != 0) -+ { -+ /* Stop increasing SEQNO. */ -+ break; -+ } -+ -+ retval = lrealpath (link); -+ -+ if (retval != NULL && !build_id_verify (retval, build_id)) -+ { -+ xfree (retval); -+ retval = NULL; -+ } -+ -+ if (retval) -+ break; - } - - if (retval != NULL) -- break; -+ { -+ /* LINK_ALL is not used below in this non-NULL RETVAL case. */ -+ break; -+ } -+ -+ if (link_all == NULL) -+ link_all = xstrdup (link); -+ else -+ { -+ size_t len_orig = strlen (link_all); -+ -+ link_all = xrealloc (link_all, len_orig + 1 + strlen (link) + 1); -+ -+ /* Use whitespace instead of DIRNAME_SEPARATOR to be compatible with -+ its possible use as an argument for installation command. */ -+ link_all[len_orig] = ' '; -+ -+ strcpy (&link_all[len_orig + 1], link); -+ } - - debugdir = debugdir_end; - } - while (*debugdir != 0); - -+ if (link_return != NULL) -+ { -+ if (retval != NULL) -+ { -+ *link_return = link; -+ link = NULL; -+ } -+ else -+ { -+ *link_return = link_all; -+ link_all = NULL; -+ } -+ } -+ xfree (link); -+ xfree (link_all); -+ -+ return retval; -+} -+ -+#ifdef HAVE_LIBRPM -+ -+#include <rpm/rpmlib.h> -+#include <rpm/rpmts.h> -+#include <rpm/rpmdb.h> -+#include <rpm/header.h> -+#ifdef DLOPEN_LIBRPM -+#include <dlfcn.h> -+#endif -+ -+/* Workarodun https://bugzilla.redhat.com/show_bug.cgi?id=643031 -+ librpm must not exit() an application on SIGINT -+ -+ Enable or disable a signal handler. SIGNUM: signal to enable (or disable -+ if negative). HANDLER: sa_sigaction handler (or NULL to use -+ rpmsqHandler()). Returns: no. of refs, -1 on error. */ -+int -+rpmsqEnable (int signum, /* rpmsqAction_t handler */ void *handler) -+{ -+ return 0; -+} -+ -+/* This MISSING_RPM_HASH tracker is used to collect all the missing rpm files -+ and avoid their duplicities during a single inferior run. */ -+ -+static struct htab *missing_rpm_hash; -+ -+/* This MISSING_RPM_LIST tracker is used to collect and print as a single line -+ all the rpms right before the nearest GDB prompt. It gets cleared after -+ each such print (it is questionable if we should clear it after the print). -+ */ -+ -+struct missing_rpm -+ { -+ struct missing_rpm *next; -+ char rpm[1]; -+ }; -+static struct missing_rpm *missing_rpm_list; -+static int missing_rpm_list_entries; -+ -+/* Returns the count of newly added rpms. */ -+ -+static int -+missing_rpm_enlist (const char *filename) -+{ -+ static int rpm_init_done = 0; -+ rpmts ts; -+ rpmdbMatchIterator mi; -+ int count = 0; -+ -+#ifdef DLOPEN_LIBRPM -+ /* Duplicate here the declarations to verify they match. The same sanity -+ check is present also in `configure.ac'. */ -+ extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg); -+ static char *(*headerFormat_p) (Header h, const char * fmt, errmsg_t *errmsg); -+ extern int rpmReadConfigFiles(const char * file, const char * target); -+ static int (*rpmReadConfigFiles_p) (const char * file, const char * target); -+ extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi); -+ static rpmdbMatchIterator (*rpmdbFreeIterator_p) (rpmdbMatchIterator mi); -+ extern Header rpmdbNextIterator(rpmdbMatchIterator mi); -+ static Header (*rpmdbNextIterator_p) (rpmdbMatchIterator mi); -+ extern rpmts rpmtsCreate(void); -+ static rpmts (*rpmtsCreate_p) (void); -+ extern rpmts rpmtsFree(rpmts ts); -+ static rpmts (*rpmtsFree_p) (rpmts ts); -+ extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmTag rpmtag, -+ const void * keyp, size_t keylen); -+ static rpmdbMatchIterator (*rpmtsInitIterator_p) (const rpmts ts, -+ rpmTag rpmtag, -+ const void *keyp, -+ size_t keylen); -+#else /* !DLOPEN_LIBRPM */ -+# define headerFormat_p headerFormat -+# define rpmReadConfigFiles_p rpmReadConfigFiles -+# define rpmdbFreeIterator_p rpmdbFreeIterator -+# define rpmdbNextIterator_p rpmdbNextIterator -+# define rpmtsCreate_p rpmtsCreate -+# define rpmtsFree_p rpmtsFree -+# define rpmtsInitIterator_p rpmtsInitIterator -+#endif /* !DLOPEN_LIBRPM */ -+ -+ gdb_assert (filename != NULL); -+ -+ if (strcmp (filename, BUILD_ID_MAIN_EXECUTABLE_FILENAME) == 0) -+ return 0; -+ -+ if (filename[0] != '/') -+ { -+ warning (_("Ignoring non-absolute filename: <%s>"), filename); -+ return 0; -+ } -+ -+ if (!rpm_init_done) -+ { -+ static int init_tried; -+ -+ /* Already failed the initialization before? */ -+ if (init_tried) -+ return 0; -+ init_tried = 1; -+ -+#ifdef DLOPEN_LIBRPM -+ { -+ void *h; -+ -+ h = dlopen (DLOPEN_LIBRPM, RTLD_LAZY); -+ if (!h) -+ { -+ warning (_("Unable to open \"%s\" (%s), " -+ "missing debuginfos notifications will not be displayed"), -+ DLOPEN_LIBRPM, dlerror ()); -+ return 0; -+ } -+ -+ if (!((headerFormat_p = dlsym (h, "headerFormat")) -+ && (rpmReadConfigFiles_p = dlsym (h, "rpmReadConfigFiles")) -+ && (rpmdbFreeIterator_p = dlsym (h, "rpmdbFreeIterator")) -+ && (rpmdbNextIterator_p = dlsym (h, "rpmdbNextIterator")) -+ && (rpmtsCreate_p = dlsym (h, "rpmtsCreate")) -+ && (rpmtsFree_p = dlsym (h, "rpmtsFree")) -+ && (rpmtsInitIterator_p = dlsym (h, "rpmtsInitIterator")))) -+ { -+ warning (_("Opened library \"%s\" is incompatible (%s), " -+ "missing debuginfos notifications will not be displayed"), -+ DLOPEN_LIBRPM, dlerror ()); -+ if (dlclose (h)) -+ warning (_("Error closing library \"%s\": %s\n"), DLOPEN_LIBRPM, -+ dlerror ()); -+ return 0; -+ } -+ } -+#endif /* DLOPEN_LIBRPM */ -+ -+ if (rpmReadConfigFiles_p (NULL, NULL) != 0) -+ { -+ warning (_("Error reading the rpm configuration files")); -+ return 0; -+ } -+ -+ rpm_init_done = 1; -+ } -+ -+ ts = rpmtsCreate_p (); -+ -+ mi = rpmtsInitIterator_p (ts, RPMTAG_BASENAMES, filename, 0); -+ if (mi != NULL) -+ { -+ for (;;) -+ { -+ Header h; -+ char *debuginfo, **slot, *s, *s2; -+ errmsg_t err; -+ size_t srcrpmlen = sizeof (".src.rpm") - 1; -+ size_t debuginfolen = sizeof ("-debuginfo") - 1; -+ rpmdbMatchIterator mi_debuginfo; -+ -+ h = rpmdbNextIterator_p (mi); -+ if (h == NULL) -+ break; -+ -+ /* Verify the debuginfo file is not already installed. */ -+ -+ debuginfo = headerFormat_p (h, "%{sourcerpm}-debuginfo.%{arch}", -+ &err); -+ if (!debuginfo) -+ { -+ warning (_("Error querying the rpm file `%s': %s"), filename, -+ err); -+ continue; -+ } -+ /* s = `.src.rpm-debuginfo.%{arch}' */ -+ s = strrchr (debuginfo, '-') - srcrpmlen; -+ s2 = NULL; -+ if (s > debuginfo && memcmp (s, ".src.rpm", srcrpmlen) == 0) -+ { -+ /* s2 = `-%{release}.src.rpm-debuginfo.%{arch}' */ -+ s2 = memrchr (debuginfo, '-', s - debuginfo); -+ } -+ if (s2) -+ { -+ /* s2 = `-%{version}-%{release}.src.rpm-debuginfo.%{arch}' */ -+ s2 = memrchr (debuginfo, '-', s2 - debuginfo); -+ } -+ if (!s2) -+ { -+ warning (_("Error querying the rpm file `%s': %s"), filename, -+ debuginfo); -+ xfree (debuginfo); -+ continue; -+ } -+ /* s = `.src.rpm-debuginfo.%{arch}' */ -+ /* s2 = `-%{version}-%{release}.src.rpm-debuginfo.%{arch}' */ -+ memmove (s2 + debuginfolen, s2, s - s2); -+ memcpy (s2, "-debuginfo", debuginfolen); -+ /* s = `XXXX.%{arch}' */ -+ /* strlen ("XXXX") == srcrpmlen + debuginfolen */ -+ /* s2 = `-debuginfo-%{version}-%{release}XX.%{arch}' */ -+ /* strlen ("XX") == srcrpmlen */ -+ memmove (s + debuginfolen, s + srcrpmlen + debuginfolen, -+ strlen (s + srcrpmlen + debuginfolen) + 1); -+ /* s = `-debuginfo-%{version}-%{release}.%{arch}' */ -+ -+ /* RPMDBI_PACKAGES requires keylen == sizeof (int). */ -+ /* RPMDBI_LABEL is an interface for NVR-based dbiFindByLabel(). */ -+ mi_debuginfo = rpmtsInitIterator_p (ts, RPMDBI_LABEL, debuginfo, 0); -+ xfree (debuginfo); -+ if (mi_debuginfo) -+ { -+ rpmdbFreeIterator_p (mi_debuginfo); -+ count = 0; -+ break; -+ } -+ -+ /* The allocated memory gets utilized below for MISSING_RPM_HASH. */ -+ debuginfo = headerFormat_p (h, -+ "%{name}-%{version}-%{release}.%{arch}", -+ &err); -+ if (!debuginfo) -+ { -+ warning (_("Error querying the rpm file `%s': %s"), filename, -+ err); -+ continue; -+ } -+ -+ /* Base package name for `debuginfo-install'. We do not use the -+ `yum' command directly as the line -+ yum --disablerepo='*' --enablerepo='*-debug*' \ -+ install NAME-debuginfo.ARCH -+ would be more complicated than just: -+ debuginfo-install NAME-VERSION-RELEASE.ARCH -+ Do not supply the rpm base name (derived from .src.rpm name) as -+ debuginfo-install is unable to install the debuginfo package if -+ the base name PKG binary rpm is not installed while for example -+ PKG-libs would be installed (RH Bug 467901). -+ FUTURE: After multiple debuginfo versions simultaneously installed -+ get supported the support for the VERSION-RELEASE tags handling -+ may need an update. */ -+ -+ if (missing_rpm_hash == NULL) -+ { -+ /* DEL_F is passed NULL as MISSING_RPM_LIST's HTAB_DELETE -+ should not deallocate the entries. */ -+ -+ missing_rpm_hash = htab_create_alloc (64, htab_hash_string, -+ (int (*) (const void *, const void *)) streq, -+ NULL, xcalloc, xfree); -+ } -+ slot = (char **) htab_find_slot (missing_rpm_hash, debuginfo, INSERT); -+ /* XCALLOC never returns NULL. */ -+ gdb_assert (slot != NULL); -+ if (*slot == NULL) -+ { -+ struct missing_rpm *missing_rpm; -+ -+ *slot = debuginfo; -+ -+ missing_rpm = xmalloc (sizeof (*missing_rpm) + strlen (debuginfo)); -+ strcpy (missing_rpm->rpm, debuginfo); -+ missing_rpm->next = missing_rpm_list; -+ missing_rpm_list = missing_rpm; -+ missing_rpm_list_entries++; -+ } -+ else -+ xfree (debuginfo); -+ count++; -+ } -+ -+ rpmdbFreeIterator_p (mi); -+ } -+ -+ rpmtsFree_p (ts); -+ -+ return count; -+} -+ -+static int -+missing_rpm_list_compar (const char *const *ap, const char *const *bp) -+{ -+ return strcoll (*ap, *bp); -+} -+ -+/* It returns a NULL-terminated array of strings needing to be FREEd. It may -+ also return only NULL. */ -+ -+static void -+missing_rpm_list_print (void) -+{ -+ char **array, **array_iter; -+ struct missing_rpm *list_iter; -+ struct cleanup *cleanups; -+ -+ if (missing_rpm_list_entries == 0) -+ return; -+ -+ array = xmalloc (sizeof (*array) * missing_rpm_list_entries); -+ cleanups = make_cleanup (xfree, array); -+ -+ array_iter = array; -+ for (list_iter = missing_rpm_list; list_iter != NULL; -+ list_iter = list_iter->next) -+ { -+ *array_iter++ = list_iter->rpm; -+ } -+ gdb_assert (array_iter == array + missing_rpm_list_entries); -+ -+ qsort (array, missing_rpm_list_entries, sizeof (*array), -+ (int (*) (const void *, const void *)) missing_rpm_list_compar); -+ -+ printf_unfiltered (_("Missing separate debuginfos, use: %s"), -+ "debuginfo-install"); -+ for (array_iter = array; array_iter < array + missing_rpm_list_entries; -+ array_iter++) -+ { -+ putchar_unfiltered (' '); -+ puts_unfiltered (*array_iter); -+ } -+ putchar_unfiltered ('\n'); -+ -+ while (missing_rpm_list != NULL) -+ { -+ list_iter = missing_rpm_list; -+ missing_rpm_list = list_iter->next; -+ xfree (list_iter); -+ } -+ missing_rpm_list_entries = 0; -+ -+ do_cleanups (cleanups); -+} -+ -+static void -+missing_rpm_change (void) -+{ -+ debug_flush_missing (); -+ -+ gdb_assert (missing_rpm_list == NULL); -+ if (missing_rpm_hash != NULL) -+ { -+ htab_delete (missing_rpm_hash); -+ missing_rpm_hash = NULL; -+ } -+} -+ -+enum missing_exec -+ { -+ /* Init state. EXEC_BFD also still could be NULL. */ -+ MISSING_EXEC_NOT_TRIED, -+ /* We saw a non-NULL EXEC_BFD but RPM has no info about it. */ -+ MISSING_EXEC_NOT_FOUND, -+ /* We found EXEC_BFD by RPM and we either have its symbols (either embedded -+ or separate) or the main executable's RPM is now contained in -+ MISSING_RPM_HASH. */ -+ MISSING_EXEC_ENLISTED -+ }; -+static enum missing_exec missing_exec = MISSING_EXEC_NOT_TRIED; -+ -+#endif /* HAVE_LIBRPM */ -+ -+void -+debug_flush_missing (void) -+{ -+#ifdef HAVE_LIBRPM -+ missing_rpm_list_print (); -+#endif -+} -+ -+/* This MISSING_FILEPAIR_HASH tracker is used only for the duplicite messages -+ yum --disablerepo='*' --enablerepo='*-debug*' install ... -+ avoidance. */ -+ -+struct missing_filepair -+ { -+ char *binary; -+ char *debug; -+ char data[1]; -+ }; -+ -+static struct htab *missing_filepair_hash; -+static struct obstack missing_filepair_obstack; -+ -+static void * -+missing_filepair_xcalloc (size_t nmemb, size_t nmemb_size) -+{ -+ void *retval; -+ size_t size = nmemb * nmemb_size; -+ -+ retval = obstack_alloc (&missing_filepair_obstack, size); -+ memset (retval, 0, size); - return retval; - } - -+static hashval_t -+missing_filepair_hash_func (const struct missing_filepair *elem) -+{ -+ hashval_t retval = 0; -+ -+ retval ^= htab_hash_string (elem->binary); -+ if (elem->debug != NULL) -+ retval ^= htab_hash_string (elem->debug); -+ -+ return retval; -+} -+ -+static int -+missing_filepair_eq (const struct missing_filepair *elem1, -+ const struct missing_filepair *elem2) -+{ -+ return strcmp (elem1->binary, elem2->binary) == 0 -+ && ((elem1->debug == NULL) == (elem2->debug == NULL)) -+ && (elem1->debug == NULL || strcmp (elem1->debug, elem2->debug) == 0); -+} -+ -+static void -+missing_filepair_change (void) -+{ -+ if (missing_filepair_hash != NULL) -+ { -+ obstack_free (&missing_filepair_obstack, NULL); -+ /* All their memory came just from missing_filepair_OBSTACK. */ -+ missing_filepair_hash = NULL; -+ } -+#ifdef HAVE_LIBRPM -+ missing_exec = MISSING_EXEC_NOT_TRIED; -+#endif -+} -+ -+static void -+debug_print_executable_changed (void) -+{ -+#ifdef HAVE_LIBRPM -+ missing_rpm_change (); -+#endif -+ missing_filepair_change (); -+} -+ -+/* Notify user the file BINARY with (possibly NULL) associated separate debug -+ information file DEBUG is missing. DEBUG may or may not be the build-id -+ file such as would be: -+ /usr/lib/debug/.build-id/dd/b1d2ce632721c47bb9e8679f369e2295ce71be.debug -+ */ -+ -+void -+debug_print_missing (const char *binary, const char *debug) -+{ -+ size_t binary_len0 = strlen (binary) + 1; -+ size_t debug_len0 = debug ? strlen (debug) + 1 : 0; -+ struct missing_filepair missing_filepair_find; -+ struct missing_filepair *missing_filepair; -+ struct missing_filepair **slot; -+ -+ if (build_id_verbose < BUILD_ID_VERBOSE_FILENAMES) -+ return; -+ -+ if (missing_filepair_hash == NULL) -+ { -+ obstack_init (&missing_filepair_obstack); -+ missing_filepair_hash = htab_create_alloc (64, -+ (hashval_t (*) (const void *)) missing_filepair_hash_func, -+ (int (*) (const void *, const void *)) missing_filepair_eq, NULL, -+ missing_filepair_xcalloc, NULL); -+ } -+ -+ /* Use MISSING_FILEPAIR_FIND first instead of calling obstack_alloc with -+ obstack_free in the case of a (rare) match. The problem is ALLOC_F for -+ MISSING_FILEPAIR_HASH allocates from MISSING_FILEPAIR_OBSTACK maintenance -+ structures for MISSING_FILEPAIR_HASH. Calling obstack_free would possibly -+ not to free only MISSING_FILEPAIR but also some such structures (allocated -+ during the htab_find_slot call). */ -+ -+ missing_filepair_find.binary = (char *) binary; -+ missing_filepair_find.debug = (char *) debug; -+ slot = (struct missing_filepair **) htab_find_slot (missing_filepair_hash, -+ &missing_filepair_find, -+ INSERT); -+ -+ /* While it may be still printed duplicitely with the missing debuginfo file -+ * it is due to once printing about the binary file build-id link and once -+ * about the .debug file build-id link as both the build-id symlinks are -+ * located in the debuginfo package. */ -+ -+ if (*slot != NULL) -+ return; -+ -+ missing_filepair = obstack_alloc (&missing_filepair_obstack, -+ sizeof (*missing_filepair) - 1 -+ + binary_len0 + debug_len0); -+ missing_filepair->binary = missing_filepair->data; -+ memcpy (missing_filepair->binary, binary, binary_len0); -+ if (debug != NULL) -+ { -+ missing_filepair->debug = missing_filepair->binary + binary_len0; -+ memcpy (missing_filepair->debug, debug, debug_len0); -+ } -+ else -+ missing_filepair->debug = NULL; -+ -+ *slot = missing_filepair; -+ -+#ifdef HAVE_LIBRPM -+ if (missing_exec == MISSING_EXEC_NOT_TRIED) -+ { -+ char *exec_filename; -+ -+ exec_filename = get_exec_file (0); -+ if (exec_filename != NULL) -+ { -+ if (missing_rpm_enlist (exec_filename) == 0) -+ missing_exec = MISSING_EXEC_NOT_FOUND; -+ else -+ missing_exec = MISSING_EXEC_ENLISTED; -+ } -+ } -+ if (missing_exec != MISSING_EXEC_ENLISTED) -+ if ((binary[0] == 0 || missing_rpm_enlist (binary) == 0) -+ && (debug == NULL || missing_rpm_enlist (debug) == 0)) -+#endif /* HAVE_LIBRPM */ -+ { -+ /* We do not collect and flush these messages as each such message -+ already requires its own separate lines. */ -+ -+ fprintf_unfiltered (gdb_stdlog, -+ _("Missing separate debuginfo for %s\n"), binary); -+ if (debug != NULL) -+ { -+ const char *p = strrchr (debug, '/'); -+ fprintf_unfiltered (gdb_stdlog, _("Try: %s%.2s%.38s\"\n"), -+ "zypper install -C \"debuginfo(build-id)=", -+ p - 2, p + 1); -+ } -+ } -+} -+ - static char * --find_separate_debug_file_by_buildid (struct objfile *objfile) -+find_separate_debug_file_by_buildid (struct objfile *objfile, -+ char **build_id_filename_return) - { - struct build_id *build_id; - -- build_id = build_id_bfd_get (objfile->obfd); -+ if (build_id_filename_return) -+ *build_id_filename_return = NULL; -+ -+ build_id = build_id_bfd_shdr_get (objfile->obfd); - if (build_id != NULL) - { - char *build_id_name; - -- build_id_name = build_id_to_debug_filename (build_id); -+ build_id_name = build_id_to_filename (build_id, build_id_filename_return, -+ 1); - xfree (build_id); - /* Prevent looping on a stripped .debug file. */ - if (build_id_name != NULL -@@ -1180,7 +2178,7 @@ find_separate_debug_file_by_buildid (str - xfree (build_id_name); - } - else if (build_id_name != NULL) -- return build_id_name; -+ return build_id_name; - } - return NULL; - } -@@ -1400,9 +2398,10 @@ elf_symfile_read (struct objfile *objfil - `.note.gnu.build-id'. */ - else if (!objfile_has_partial_symbols (objfile)) - { -- char *debugfile; -+ char *debugfile, *build_id_filename; - -- debugfile = find_separate_debug_file_by_buildid (objfile); -+ debugfile = find_separate_debug_file_by_buildid (objfile, -+ &build_id_filename); - - if (debugfile == NULL) - debugfile = find_separate_debug_file_by_debuglink (objfile); -@@ -1414,6 +2413,12 @@ elf_symfile_read (struct objfile *objfil - symbol_file_add_separate (abfd, symfile_flags, objfile); - xfree (debugfile); - } -+ /* Check if any separate debug info has been extracted out. */ -+ else if (bfd_get_section_by_name (objfile->obfd, ".gnu_debuglink") -+ != NULL) -+ debug_print_missing (objfile->name, build_id_filename); -+ -+ xfree (build_id_filename); - } - } - -@@ -1629,4 +2634,16 @@ _initialize_elfread (void) - - elf_objfile_gnu_ifunc_cache_data = register_objfile_data (); - gnu_ifunc_fns_p = &elf_gnu_ifunc_fns; -+ -+ add_setshow_zinteger_cmd ("build-id-verbose", no_class, &build_id_verbose, -+ _("\ -+Set debugging level of the build-id locator."), _("\ -+Show debugging level of the build-id locator."), _("\ -+Level 1 (default) enables printing the missing debug filenames,\n\ -+level 2 also prints the parsing of binaries to find the identificators."), -+ NULL, -+ show_build_id_verbose, -+ &setlist, &showlist); -+ -+ observer_attach_executable_changed (debug_print_executable_changed); - } -diff -rup gdb-7.4ori//gdb/event-top.c gdb-7.4/gdb/event-top.c ---- gdb-7.4ori//gdb/event-top.c 2012-01-06 05:43:11.000000000 +0100 -+++ gdb-7.4/gdb/event-top.c 2012-05-10 11:26:26.311643428 +0200 -@@ -36,6 +36,7 @@ - #include "observer.h" - #include "continuations.h" - #include "gdbcmd.h" /* for dont_repeat() */ -+#include "symfile.h" - - /* readline include files. */ - #include "readline/readline.h" -@@ -176,6 +177,8 @@ rl_callback_read_char_wrapper (gdb_clien - void - cli_command_loop (void) - { -+ debug_flush_missing (); -+ - display_gdb_prompt (0); - - /* Now it's time to start the event loop. */ -@@ -241,6 +244,8 @@ display_gdb_prompt (char *new_prompt) - /* Reset the nesting depth used when trace-commands is set. */ - reset_command_nest_depth (); - -+ debug_flush_missing (); -+ - /* Each interpreter has its own rules on displaying the command - prompt. */ - if (!current_interp_display_prompt_p ()) -diff -rup gdb-7.4ori//gdb/objfiles.h gdb-7.4/gdb/objfiles.h ---- gdb-7.4ori//gdb/objfiles.h 2012-01-06 05:43:21.000000000 +0100 -+++ gdb-7.4/gdb/objfiles.h 2012-05-10 11:10:37.459644929 +0200 -@@ -433,6 +433,10 @@ struct objfile - - #define OBJF_MAINLINE (1 << 5) - -+/* This file was loaded according to the BUILD_ID_CORE_LOADS rules. */ -+ -+#define OBJF_BUILD_ID_CORE_LOADED (1 << 12) -+ - /* The object file that contains the runtime common minimal symbols - for SunOS4. Note that this objfile has no associated BFD. */ - -diff -rup gdb-7.4ori//gdb/proc-service.list gdb-7.4/gdb/proc-service.list ---- gdb-7.4ori//gdb/proc-service.list 2012-01-06 05:43:25.000000000 +0100 -+++ gdb-7.4/gdb/proc-service.list 2012-05-10 11:27:09.947643359 +0200 -@@ -37,4 +37,7 @@ - ps_pstop; - ps_ptread; - ps_ptwrite; -+ -+ /* gdb-6.6-buildid-locate-rpm.patch */ -+ rpmsqEnable; - }; -diff -rup gdb-7.4ori//gdb/solib-svr4.c gdb-7.4/gdb/solib-svr4.c ---- gdb-7.4ori//gdb/solib-svr4.c 2012-01-06 05:43:30.000000000 +0100 -+++ gdb-7.4/gdb/solib-svr4.c 2012-05-10 11:10:37.455644929 +0200 -@@ -1227,9 +1227,52 @@ svr4_read_so_list (CORE_ADDR lm, struct - continue; - } - -- strncpy (new->so_name, buffer, SO_NAME_MAX_PATH_SIZE - 1); -- new->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; -- strcpy (new->so_original_name, new->so_name); -+ { -+ struct build_id *build_id; -+ -+ strncpy (new->so_original_name, buffer, SO_NAME_MAX_PATH_SIZE - 1); -+ new->so_original_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; -+ /* May get overwritten below. */ -+ strcpy (new->so_name, new->so_original_name); -+ -+ build_id = build_id_addr_get (new->lm_info->l_ld); -+ if (build_id != NULL) -+ { -+ char *name, *build_id_filename; -+ -+ /* Missing the build-id matching separate debug info file -+ would be handled while SO_NAME gets loaded. */ -+ name = build_id_to_filename (build_id, &build_id_filename, 0); -+ if (name != NULL) -+ { -+ strncpy (new->so_name, name, SO_NAME_MAX_PATH_SIZE - 1); -+ new->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; -+ xfree (name); -+ } -+ else -+ { -+ debug_print_missing (new->so_name, build_id_filename); -+ -+ /* In the case the main executable was found according to -+ its build-id (from a core file) prevent loading -+ a different build of a library with accidentally the -+ same SO_NAME. -+ -+ It suppresses bogus backtraces (and prints "??" there -+ instead) if the on-disk files no longer match the -+ running program version. */ -+ -+ if (symfile_objfile != NULL -+ && (symfile_objfile->flags -+ & OBJF_BUILD_ID_CORE_LOADED) != 0) -+ new->so_name[0] = 0; -+ } -+ -+ xfree (build_id_filename); -+ xfree (build_id); -+ } -+ } -+ - xfree (buffer); - - /* If this entry has no name, or its name matches the name -diff -rup gdb-7.4ori//gdb/symfile.h gdb-7.4/gdb/symfile.h ---- gdb-7.4ori//gdb/symfile.h 2012-01-06 05:43:31.000000000 +0100 -+++ gdb-7.4/gdb/symfile.h 2012-05-10 11:26:26.311643428 +0200 -@@ -560,6 +560,15 @@ void free_symfile_segment_data (struct s - - extern struct cleanup *increment_reading_symtab (void); - -+/* build-id support. */ -+struct build_id; -+extern struct build_id *build_id_addr_get (CORE_ADDR addr); -+extern char *build_id_to_filename (struct build_id *build_id, -+ char **link_return, int add_debug_suffix); -+extern void debug_print_missing (const char *binary, const char *debug); -+extern void debug_flush_missing (void); -+#define BUILD_ID_MAIN_EXECUTABLE_FILENAME _("the main executable file") -+ - /* From dwarf2read.c */ - - /* Names for a dwarf2 debugging section. The field NORMAL is the normal -diff -rup gdb-7.4ori//gdb/testsuite/lib/gdb.exp gdb-7.4/gdb/testsuite/lib/gdb.exp ---- gdb-7.4ori//gdb/testsuite/lib/gdb.exp 2012-01-06 05:54:30.000000000 +0100 -+++ gdb-7.4/gdb/testsuite/lib/gdb.exp 2012-05-10 11:26:26.315643428 +0200 -@@ -1392,6 +1392,16 @@ proc default_gdb_start { } { - warning "Couldn't set the width to 0." - } - } -+ # Turn off the missing RPMs warnings as the testsuite does not expect it. -+ send_gdb "set build-id-verbose 0\n" -+ gdb_expect 10 { -+ -re "$gdb_prompt $" { -+ verbose "Disabled the missing debug infos warnings." 2 -+ } -+ timeout { -+ warning "Could not disable the missing debug infos warnings.." -+ } -+ } - return 0; - } - -diff -rup gdb-7.4ori//gdb/testsuite/lib/mi-support.exp gdb-7.4/gdb/testsuite/lib/mi-support.exp ---- gdb-7.4ori//gdb/testsuite/lib/mi-support.exp 2012-01-06 05:54:30.000000000 +0100 -+++ gdb-7.4/gdb/testsuite/lib/mi-support.exp 2012-05-10 11:26:26.315643428 +0200 -@@ -212,6 +212,16 @@ proc default_mi_gdb_start { args } { - warning "Couldn't set the width to 0." - } - } -+ # Turn off the missing RPMs warnings as the testsuite does not expect it. -+ send_gdb "190-gdb-set build-id-verbose 0\n" -+ gdb_expect 10 { -+ -re ".*190-gdb-set build-id-verbose 0\r\n190\\\^done\r\n$mi_gdb_prompt$" { -+ verbose "Disabled the missing debug infos warnings." 2 -+ } -+ timeout { -+ warning "Could not disable the missing debug infos warnings.." -+ } -+ } - # If allowing the inferior to have its own PTY then assign the inferior - # its own terminal device here. - if { $separate_inferior_pty } { -diff -rup gdb-7.4ori//gdb/tui/tui-interp.c gdb-7.4/gdb/tui/tui-interp.c ---- gdb-7.4ori//gdb/tui/tui-interp.c 2012-01-06 05:54:35.000000000 +0100 -+++ gdb-7.4/gdb/tui/tui-interp.c 2012-05-10 11:26:26.315643428 +0200 -@@ -30,6 +30,7 @@ - #include "tui/tui.h" - #include "tui/tui-io.h" - #include "exceptions.h" -+#include "symfile.h" - - /* Set to 1 when the TUI mode must be activated when we first start - gdb. */ diff --git a/dist/gdb/patches/gdb-ipv6.patch b/dist/gdb/patches/gdb-ipv6.patch deleted file mode 100644 index d595f7edd1..0000000000 --- a/dist/gdb/patches/gdb-ipv6.patch +++ /dev/null @@ -1,1037 +0,0 @@ -diff -Nru a/gdb-7.6.1/gdb/gdbserver/gdbreplay.c b/gdb-7.6.1/gdb/gdbserver/gdbreplay.c ---- a/gdb-7.6.1/gdb/gdbserver/gdbreplay.c 2012-08-22 13:05:02 -0700 -+++ b/gdb-7.6.1/gdb/gdbserver/gdbreplay.c 2013-04-15 03:20:40 -0700 -@@ -189,14 +189,41 @@ remote_close (void) - static void - remote_open (char *name) - { -- if (!strchr (name, ':')) -+ char *port_str; -+ char *host_start, *host_end; -+ -+ host_start = name; -+ if (host_start[0] == '[') - { -- fprintf (stderr, "%s: Must specify tcp connection as host:addr\n", name); -- fflush (stderr); -- exit (1); -+ ++host_start; -+ host_end = strchr (host_start, ']'); -+ if (host_end == NULL) -+ { -+ fprintf (stderr, "Mismatched `[' in hostname."); -+ fflush (stderr); -+ exit (1); -+ } -+ port_str = host_end + 1; -+ if (*port_str != ':') -+ { -+ fprintf (stderr, "Missing port after hostname, specify tcp connection as host:port or [host]:port."); -+ fflush (stderr); -+ exit (1); -+ } - } - else - { -+ port_str = strchr (name, ':'); -+ host_end = port_str; -+ if (port_str == NULL) -+ { -+ fprintf (stderr, "Missing port after hostname, specify tcp connection as host:port or [host]:port."); -+ fflush (stderr); -+ exit(1); -+ } -+ } -+ -+ { - #ifdef USE_WIN32API - static int winsock_initialized; - #endif -diff -Nru a/gdb-7.6.1/gdb/gdbserver/remote-utils.c b/gdb-7.6.1/gdb/gdbserver/remote-utils.c ---- a/gdb-7.6.1/gdb/gdbserver/remote-utils.c 2012-04-28 23:28:30 -0700 -+++ b/gdb-7.6.1/gdb/gdbserver/remote-utils.c 2013-04-16 06:25:07 -0700 -@@ -16,6 +16,8 @@ - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ - -+#define _WIN32_WINNT 0x501 -+ - #include "server.h" - #include "terminal.h" - #include "target.h" -@@ -63,6 +65,13 @@ - - #if USE_WIN32API - #include <winsock2.h> -+#include <ws2tcpip.h> -+#else -+#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */ -+#endif -+ -+#ifndef SOL_IPV6 -+#define SOL_IPV6 IPPROTO_IPV6 - #endif - - #if __QNX__ -@@ -109,7 +118,7 @@ - static int remote_is_stdio = 0; - - gdb_fildes_t remote_desc = INVALID_DESCRIPTOR; --gdb_fildes_t listen_desc = INVALID_DESCRIPTOR; -+gdb_fildes_t *listening_sockets = NULL; - - /* FIXME headerize? */ - extern int using_threads; -@@ -156,15 +165,17 @@ - static int - handle_accept_event (int err, gdb_client_data client_data) - { -- struct sockaddr_in sockaddr; -+ struct sockaddr_storage address; - socklen_t tmp; -+ char back_host[64], back_port[16]; -+ gdb_fildes_t listen_desc = *(gdb_fildes_t *)client_data; - - if (debug_threads) - fprintf (stderr, "handling possible accept event\n"); - -- tmp = sizeof (sockaddr); -- remote_desc = accept (listen_desc, (struct sockaddr *) &sockaddr, &tmp); -- if (remote_desc == -1) -+ tmp = (socklen_t) sizeof (address); -+ remote_desc = accept (listen_desc, (struct sockaddr *) &address, &tmp); -+ if (remote_desc == INVALID_DESCRIPTOR) - perror_with_name ("Accept failed"); - - /* Enable TCP keep alive process. */ -@@ -178,27 +189,55 @@ - setsockopt (remote_desc, IPPROTO_TCP, TCP_NODELAY, - (char *) &tmp, sizeof (tmp)); - -+ if (listening_sockets) -+ { -+ /* We assume that all sockets have been registered, and none triggers -+ while doing this. This is true in the current single threaded -+ implementation. */ -+ gdb_fildes_t *l_sock = listening_sockets; -+ for (++l_sock; *l_sock != INVALID_DESCRIPTOR; ++l_sock) -+ { - #ifndef USE_WIN32API -- signal (SIGPIPE, SIG_IGN); /* If we don't do this, then gdbserver simply -- exits when the remote side dies. */ -+ signal (SIGPIPE, SIG_IGN); /* If we don't do this, then gdbserver simply -+ exits when the remote side dies. */ - #endif - -- if (run_once) -- { -+ if (run_once) -+ { - #ifndef USE_WIN32API -- close (listen_desc); /* No longer need this */ -+ close (*l_sock); /* No longer need this */ - #else -- closesocket (listen_desc); /* No longer need this */ -+ closesocket (*l_sock); /* No longer need this */ - #endif -- } -+ } - -- /* Even if !RUN_ONCE no longer notice new connections. Still keep the -+ /* Even if !RUN_ONCE no longer notice new connections. Still keep the - descriptor open for add_file_handler to wait for a new connection. */ -- delete_file_handler (listen_desc); -+ delete_file_handler (*l_sock); -+ } -+ if (run_once) -+ { -+ free(listening_sockets); -+ listening_sockets = NULL; -+ } -+ } - - /* Convert IP address to string. */ -- fprintf (stderr, "Remote debugging from host %s\n", -- inet_ntoa (sockaddr.sin_addr)); -+ if (getnameinfo ((struct sockaddr *) &address, -+ (socklen_t) sizeof (address), -+ back_host, (socklen_t) sizeof (back_host), -+ back_port, (socklen_t) sizeof (back_port), -+ NI_NUMERICHOST | NI_NUMERICSERV)) -+ { -+ fprintf (stderr, "Error detecting originating address, trying anyway\n"); -+ } -+ else -+ { -+ back_host[sizeof (back_host) - 1] = 0; -+ back_port[sizeof (back_port) - 1] = 0; -+ fprintf (stderr, "Remote debugging from host %s port %s\n", -+ back_host, back_port); -+ } - - enable_async_notification (remote_desc); - -@@ -224,12 +263,15 @@ - { - char *port_str; - #ifdef USE_WIN32API -- static int winsock_initialized; -+ static int winsock_initialized = 0; - #endif -- int port; -- struct sockaddr_in sockaddr; -- socklen_t tmp; -- char *port_end; -+ char *host_start, *host_end; -+ struct addrinfo hints, *ainfo, *ainfo0; -+ gdb_fildes_t *socktable = NULL; -+ gdb_fildes_t s = INVALID_DESCRIPTOR; -+ int nsock = 0, socktable_size = 0, err, port = 0; -+ char *host_str = NULL; -+ char back_host[128], back_port[32]; - - remote_is_stdio = 0; - if (strcmp (name, STDIO_CONNECTION_NAME) == 0) -@@ -249,8 +291,24 @@ - return; - } - -- port = strtoul (port_str + 1, &port_end, 10); -- if (port_str[1] == '\0' || *port_end != '\0') -+ host_start = name; -+ if (host_start[0] == '[') -+ { -+ ++host_start; -+ host_end = strchr (host_start, ']'); -+ if (host_end == NULL) -+ fatal ("Mismatched `[' in hostname."); -+ port_str = host_end + 1; -+ if (*port_str != ':') -+ fatal ("Missing port after hostname."); -+ } -+ else -+ { -+ port_str = strchr (name, ':'); -+ host_end = port_str; -+ } -+ -+ if (port_str[1] == '\0') - fatal ("Bad port argument: %s", name); - - #ifdef USE_WIN32API -@@ -263,24 +321,181 @@ - } - #endif - -- listen_desc = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP); -- if (listen_desc == -1) -- perror_with_name ("Can't open socket"); -+ if (host_start < host_end) -+ { -+ host_str = strdup(host_start); -+ host_str[host_end - host_start] = 0; -+ } -+ ++port_str; - -- /* Allow rapid reuse of this port. */ -- tmp = 1; -- setsockopt (listen_desc, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp, -- sizeof (tmp)); -+ memset(&hints, 0, sizeof(hints)); -+ hints.ai_family = PF_UNSPEC; -+ hints.ai_socktype = SOCK_STREAM; -+ hints.ai_flags = AI_PASSIVE; -+ -+ err = getaddrinfo(host_str, port_str, &hints, &ainfo0); -+ if (err) -+ fatal ("%s for %s", gai_strerror(err), name); -+ -+ for (ainfo = ainfo0; ainfo; ainfo = ainfo->ai_next) -+ { -+ int current_port, tmp; -+ -+ if (getnameinfo ((struct sockaddr *) ainfo->ai_addr, -+ (socklen_t) ainfo->ai_addrlen, -+ back_host, (socklen_t) sizeof (back_host), -+ back_port, (socklen_t) sizeof (back_port), -+ NI_NUMERICHOST | NI_NUMERICSERV)) -+ { -+ back_host[0] = 0; -+ back_port[0] = 0; -+ } -+ else -+ { -+ back_host[sizeof (back_host) - 1] = 0; -+ back_port[sizeof (back_port) - 1] = 0; -+ } -+ -+ switch (ainfo->ai_addr->sa_family) -+ { -+ case AF_INET: -+ current_port = ntohs (((struct sockaddr_in *) ainfo->ai_addr) -+ ->sin_port); -+ break; -+ case AF_INET6: -+ current_port = ntohs (((struct sockaddr_in6 *) ainfo->ai_addr) -+ ->sin6_port); -+ break; -+ default: -+ fatal ("Unexpected address family: %d for %s %s", -+ ainfo->ai_addr->sa_family,back_host,back_port); -+ } -+ -+ if (port != 0 && current_port == 0) -+ { -+ /* Use the same port for all protocol/interfaces. */ -+ switch (ainfo->ai_addr->sa_family) -+ { -+ case AF_INET: -+ ((struct sockaddr_in *) ainfo->ai_addr)->sin_port = -+ htons(port); -+ break; -+ case AF_INET6: -+ ((struct sockaddr_in6 *) ainfo->ai_addr)->sin6_port = -+ htons(port); -+ break; -+ } -+ } -+ s = socket(ainfo->ai_family, ainfo->ai_socktype, ainfo->ai_protocol); -+ if (s < 0) -+ continue; -+ -+ /* Allow rapid reuse of this port. */ -+ tmp = 1; -+ if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp, -+ (socklen_t) sizeof (tmp)) != 0) -+ { -+ fprintf (stderr, "Trying to bind %s port %s.\n", -+ back_host, back_port); -+ perror("setsockopt(s, SOL_SOCKET, SO_REUSEADDR,[1],4)"); -+ } -+#ifdef IPV6_V6ONLY -+ if (ainfo->ai_addr->sa_family == AF_INET6 -+ && setsockopt (s, SOL_IPV6, IPV6_V6ONLY, (char *) &tmp, -+ (socklen_t) sizeof (tmp)) != 0) -+ { -+ fprintf (stderr, "Trying to bind %s port %s.\n", -+ back_host, back_port); -+ perror("setsockopt(s, SOL_IPV6, IPV6_V6ONLY,[1],4)"); -+ } -+#endif -+ -+ if (bind (s, ainfo->ai_addr, ainfo->ai_addrlen) != 0) -+ { -+ fprintf (stderr, "Trying to bind %s port %s.\n", -+ back_host, back_port); -+ perror ("bind failed"); -+ close (s); -+ s = -1; -+ continue; -+ } -+ -+ if (listen (s, 1) != 0) -+ { -+ fprintf (stderr, "Trying to bind %s port %s.\n", -+ back_host, back_port); -+ perror ("Can't listen to a bound socket"); -+ close (s); -+ s = -1; -+ continue; -+ } -+ -+ { -+ struct sockaddr_storage address; -+ socklen_t alen = (socklen_t) sizeof (address); -+ -+ if (getsockname (s, (struct sockaddr *) &address, &alen)) -+ fatal ("Failed to get socket address %s, on soket bound to %s port %s.", -+ strerror (errno), back_host, back_port); -+ -+ if (port == 0) -+ /* Try to recover the port set by the kernel. */ -+ switch (address.ss_family) -+ { -+ case AF_INET: -+ port = ntohs (((struct sockaddr_in *) &address)->sin_port); -+ break; -+ case AF_INET6: -+ port = ntohs (((struct sockaddr_in6 *) &address)->sin6_port); -+ break; -+ default: -+ fatal ("Unexpected address family: %d", address.ss_family); -+ } -+ -+ if (getnameinfo ((struct sockaddr *) &address, -+ (socklen_t) sizeof (address), -+ back_host, (socklen_t) sizeof (back_host), -+ back_port, (socklen_t) sizeof (back_port), -+ NI_NUMERICHOST | NI_NUMERICSERV)) -+ { -+ fprintf (stderr, "Error detecting bound address.\n"); -+ } -+ else -+ { -+ back_host[sizeof (back_host) - 1] = 0; -+ back_port[sizeof (back_port) - 1] = 0; -+ fprintf (stderr, "Sucessfully bound %s port %s\n", -+ back_host, back_port); -+ } -+ } - -- sockaddr.sin_family = PF_INET; -- sockaddr.sin_port = htons (port); -- sockaddr.sin_addr.s_addr = INADDR_ANY; -- -- if (bind (listen_desc, (struct sockaddr *) &sockaddr, sizeof (sockaddr)) -- || listen (listen_desc, 1)) -- perror_with_name ("Can't bind address"); -+ if (socktable_size < nsock + 3) -+ { -+ socktable = xrealloc (socktable, -+ (nsock + 10) * sizeof (gdb_fildes_t)); -+ socktable[0] = INVALID_DESCRIPTOR; -+ } -+ socktable[++nsock] = s; -+ } -+ -+ freeaddrinfo (ainfo0); -+ free (host_str); -+ -+ if (nsock == 0) -+ fatal("Failed to bind any socket."); -+ -+ /* Bound socktable from both ends, so an inner pointer can still -+ find the whole array. */ -+ socktable[++nsock] = INVALID_DESCRIPTOR; - - transport_is_reliable = 1; -+ fprintf (stderr, "Listening on port %d\n", port); -+ fflush (stderr); -+ transport_is_reliable = 1; -+ if (listening_sockets) -+ fatal ("Multiple concurrent remote_open not supported."); -+ -+ listening_sockets = socktable; - } - - /* Open a connection to a remote debugger. -@@ -290,8 +505,24 @@ - remote_open (char *name) - { - char *port_str; -+ char *host_start, *host_end; - -- port_str = strchr (name, ':'); -+ host_start = name; -+ if (host_start[0] == '[') -+ { -+ ++host_start; -+ host_end = strchr (host_start, ']'); -+ if (host_end == NULL) -+ fatal ("Mismatched `[' in hostname."); -+ port_str = host_end + 1; -+ if (*port_str != ':') -+ fatal ("Missing port after hostname."); -+ } -+ else -+ { -+ port_str = strchr (name, ':'); -+ host_end = port_str; -+ } - #ifdef USE_WIN32API - if (port_str == NULL) - error ("Only <host>:<port> is supported on this platform."); -@@ -381,22 +612,17 @@ - #endif /* USE_WIN32API */ - else - { -- int port; -- socklen_t len; -- struct sockaddr_in sockaddr; -- -- len = sizeof (sockaddr); -- if (getsockname (listen_desc, -- (struct sockaddr *) &sockaddr, &len) < 0 -- || len < sizeof (sockaddr)) -- perror_with_name ("Can't determine port"); -- port = ntohs (sockaddr.sin_port); -+ int isock; - -- fprintf (stderr, "Listening on port %d\n", port); -- fflush (stderr); -- -- /* Register the event loop handler. */ -- add_file_handler (listen_desc, handle_accept_event, NULL); -+ if (! listening_sockets) -+ fatal ("Listening_sockets not initialized (missing call to remote_prepare)."); -+ for (isock = 1; listening_sockets[isock] != INVALID_DESCRIPTOR; ++isock) -+ { -+ /* This assumes the loop ends before any of the handlers is called. -+ This is true in the current non threaded implementation. */ -+ add_file_handler (listening_sockets[isock], handle_accept_event, -+ listening_sockets + isock); -+ } - } - } - -diff -Nru a/gdb-7.6.1/gdb/ser-tcp.c b/gdb-7.6.1/gdb/ser-tcp.c ---- a/gdb-7.6.1/gdb/ser-tcp.c 2012-01-04 00:17:10 -0800 -+++ b/gdb-7.6.1/gdb/ser-tcp.c 2013-04-15 03:20:40 -0700 -@@ -37,7 +37,9 @@ - #include <sys/time.h> - - #ifdef USE_WIN32API -+#define _WIN32_WINNT 0x0501 - #include <winsock2.h> -+#include <ws2tcpip.h> - #ifndef ETIMEDOUT - #define ETIMEDOUT WSAETIMEDOUT - #endif -@@ -49,6 +51,7 @@ - #include <netdb.h> - #include <sys/socket.h> - #include <netinet/tcp.h> -+#include <netinet/in.h> - #endif - - #include <signal.h> -@@ -78,76 +81,49 @@ static unsigned int tcp_retry_limit = 15 - - #define POLL_INTERVAL 5 - --/* Helper function to wait a while. If SCB is non-null, wait on its -- file descriptor. Otherwise just wait on a timeout, updating *POLLS. -- Returns -1 on timeout or interrupt, otherwise the value of select. */ -+enum { -+ ADDR_DROP, -+ ADDR_RECONNECT, -+ ADDR_WAIT, -+ ADDR_SUCCESS -+}; - -+/* Tries to connect to a socket */ - static int --wait_for_connect (struct serial *scb, int *polls) -+check_sock_err (int fd) - { -- struct timeval t; -- int n; -- -- /* While we wait for the connect to complete, -- poll the UI so it can update or the user can -- interrupt. */ -- if (deprecated_ui_loop_hook && deprecated_ui_loop_hook (0)) -- { -- errno = EINTR; -- return -1; -- } -- -- /* Check for timeout. */ -- if (*polls > tcp_retry_limit * POLL_INTERVAL) -- { -- errno = ETIMEDOUT; -- return -1; -- } -- -- /* Back off to polling once per second after the first POLL_INTERVAL -- polls. */ -- if (*polls < POLL_INTERVAL) -- { -- t.tv_sec = 0; -- t.tv_usec = 1000000 / POLL_INTERVAL; -- } -- else -- { -- t.tv_sec = 1; -- t.tv_usec = 0; -- } -+ int res, err; -+ socklen_t len; - -- if (scb) -+ len = sizeof (err); -+ /* On Windows, the fourth parameter to getsockopt is a "char *"; -+ on UNIX systems it is generally "void *". The cast to "void *" -+ is OK everywhere, since in C "void *" can be implicitly -+ converted to any pointer type. */ -+ res = getsockopt (fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len); -+ if (res < 0 || err) - { -- fd_set rset, wset, eset; -- -- FD_ZERO (&rset); -- FD_SET (scb->fd, &rset); -- wset = rset; -- eset = rset; -- -- /* POSIX systems return connection success or failure by signalling -- wset. Windows systems return success in wset and failure in -- eset. -- -- We must call select here, rather than gdb_select, because -- the serial structure has not yet been initialized - the -- MinGW select wrapper will not know that this FD refers -- to a socket. */ -- n = select (scb->fd + 1, &rset, &wset, &eset, &t); -+ /* Maybe the target still isn't ready to accept the connection. */ -+ if (tcp_auto_retry -+ #ifdef USE_WIN32API -+ && err == WSAECONNREFUSED -+ #else -+ && err == ECONNREFUSED -+ #endif -+ ) -+ { -+ close (fd); -+ return ADDR_RECONNECT; -+ } -+ else -+ { -+ if (err) -+ errno = err; -+ close (fd); -+ return ADDR_DROP; -+ } - } -- else -- /* Use gdb_select here, since we have no file descriptors, and on -- Windows, plain select doesn't work in that case. */ -- n = gdb_select (0, NULL, NULL, NULL, &t); -- -- /* If we didn't time out, only count it as one poll. */ -- if (n > 0 || *polls < POLL_INTERVAL) -- (*polls)++; -- else -- (*polls) += POLL_INTERVAL; -- -- return n; -+ return ADDR_SUCCESS; - } - - /* Open a tcp socket. */ -@@ -155,18 +131,24 @@ wait_for_connect (struct serial *scb, in - int - net_open (struct serial *scb, const char *name) - { -- char *port_str, hostname[100]; -- int n, port, tmp; -+ char *port_str, hostname[100], *name_end; -+ int n = 0, tmp; - int use_udp; - struct hostent *hostent; -- struct sockaddr_in sockaddr; -+ struct addrinfo hints, *ainfo, *ainfo0, *ainfo_reconnect, *ainfo_old, -+ *ainfo_tmp; -+ struct sockaddr_storage address; -+ int max_w_socks = 0, n_w_socks = 0; -+ int *waiting_socks = NULL; - #ifdef USE_WIN32API - u_long ioarg; - #else - int ioarg; - #endif - int polls = 0; -+ int err, fd = -1; - -+ scb->fd = -1; - use_udp = 0; - if (strncmp (name, "udp:", 4) == 0) - { -@@ -176,134 +158,286 @@ net_open (struct serial *scb, const char - else if (strncmp (name, "tcp:", 4) == 0) - name = name + 4; - -- port_str = strchr (name, ':'); -- -- if (!port_str) -- error (_("net_open: No colon in host name!")); /* Shouldn't ever -+ if (name[0]=='[') -+ { -+ ++name; -+ name_end = strchr(name, ']'); -+ if (name_end == NULL) -+ error (_("net_open: Mismatched '['")); -+ port_str = name_end+1; -+ } else { -+ port_str = strchr (name, ':'); -+ name_end = port_str; -+ } -+ if (!port_str || port_str[0] !=':') -+ error (_("net_open: No colon after host name!")); /* Shouldn't ever - happen. */ - -- tmp = min (port_str - name, (int) sizeof hostname - 1); -- strncpy (hostname, name, tmp); /* Don't want colon. */ -- hostname[tmp] = '\000'; /* Tie off host name. */ -- port = atoi (port_str + 1); -- -- /* Default hostname is localhost. */ -- if (!hostname[0]) -- strcpy (hostname, "localhost"); -- -- hostent = gethostbyname (hostname); -- if (!hostent) -+ tmp = min (name_end - name, (int) sizeof hostname - 1); -+ /* Default hostname is localhost. Keeping this but NULL should also work. */ -+ if (!name[0]) - { -- fprintf_unfiltered (gdb_stderr, "%s: unknown host\n", hostname); -- errno = ENOENT; -- return -1; -+ strcpy (hostname, "localhost"); - } -- -- sockaddr.sin_family = PF_INET; -- sockaddr.sin_port = htons (port); -- memcpy (&sockaddr.sin_addr.s_addr, hostent->h_addr, -- sizeof (struct in_addr)); -- -- retry: -- -- if (use_udp) -- scb->fd = socket (PF_INET, SOCK_DGRAM, 0); - else -- scb->fd = socket (PF_INET, SOCK_STREAM, 0); -- -- if (scb->fd == -1) -- return -1; -+ { -+ strncpy (hostname, name, tmp); /* Don't want colon. */ -+ hostname[tmp] = '\000'; /* Tie off host name. */ -+ } -+ ++port_str; - -- /* Set socket nonblocking. */ -- ioarg = 1; -- ioctl (scb->fd, FIONBIO, &ioarg); -+ -+ memset(&hints, 0, sizeof(hints)); -+ hints.ai_family = PF_UNSPEC; -+ if (use_udp) -+ hints.ai_socktype = SOCK_DGRAM; -+ else -+ hints.ai_socktype = SOCK_STREAM; - -- /* Use Non-blocking connect. connect() will return 0 if connected -- already. */ -- n = connect (scb->fd, (struct sockaddr *) &sockaddr, sizeof (sockaddr)); -+ err = getaddrinfo(hostname, port_str, &hints, &ainfo0); -+ if (err) -+ { -+ fprintf_unfiltered (gdb_stderr, "%s: connecting to %s on port %s\n", -+ gai_strerror(err), hostname, port_str); -+ errno = ENOENT; -+ return -1; -+ } - -- if (n < 0) -+ do - { --#ifdef USE_WIN32API -- int err = WSAGetLastError(); --#else -- int err = errno; --#endif -+ ainfo = ainfo0; -+ ainfo_old = NULL; -+ while (ainfo) -+ { -+ int op_to_do, connect_ret; -+ -+ ainfo_old = ainfo; -+ fd = socket (ainfo->ai_family, ainfo->ai_socktype, -+ ainfo->ai_protocol); -+ -+ if (fd == -1) -+ { -+ ainfo = ainfo->ai_next; -+ continue; -+ } -+ -+ /* Set socket nonblocking. */ -+ ioarg = 1; -+ ioctl (fd, FIONBIO, &ioarg); -+ -+ /* Use Non-blocking connect. connect() will return 0 if connected -+ already. */ -+ connect_ret = connect (fd, ainfo->ai_addr, ainfo->ai_addrlen); - -- /* Maybe we're waiting for the remote target to become ready to -- accept connections. */ -- if (tcp_auto_retry -+ if (connect_ret < 0) -+ { - #ifdef USE_WIN32API -- && err == WSAECONNREFUSED -+ int err = WSAGetLastError(); - #else -- && err == ECONNREFUSED -+ int err = errno; - #endif -- && wait_for_connect (NULL, &polls) >= 0) -- { -- close (scb->fd); -- goto retry; -- } - -- if ( --#ifdef USE_WIN32API -- /* Under Windows, calling "connect" with a non-blocking socket -- results in WSAEWOULDBLOCK, not WSAEINPROGRESS. */ -- err != WSAEWOULDBLOCK --#else -- err != EINPROGRESS --#endif -- ) -- { -- errno = err; -- net_close (scb); -- return -1; -- } -- -- /* Looks like we need to wait for the connect. */ -- do -- { -- n = wait_for_connect (scb, &polls); -- } -- while (n == 0); -- if (n < 0) -- { -- net_close (scb); -- return -1; -- } -+ /* Maybe we're waiting for the remote target to become ready to -+ accept connections. */ -+ if (tcp_auto_retry -+ #ifdef USE_WIN32API -+ && err == WSAECONNREFUSED -+ #else -+ && err == ECONNREFUSED -+ #endif -+ ) -+ { -+ close (fd); -+ op_to_do = ADDR_RECONNECT; -+ } -+ else if ( -+ #ifdef USE_WIN32API -+ /* Under Windows, calling "connect" with a non-blocking socket -+ results in WSAEWOULDBLOCK, not WSAEINPROGRESS. */ -+ err != WSAEWOULDBLOCK -+ #else -+ err != EINPROGRESS -+ #endif -+ ) -+ { -+ close (fd); -+ op_to_do = ADDR_DROP; -+ } -+ else -+ { -+ op_to_do = ADDR_WAIT; -+ } -+ } -+ else -+ { -+ op_to_do = check_sock_err(fd); -+ } -+ switch (op_to_do) -+ { -+ case ADDR_DROP: -+ break; -+ case ADDR_RECONNECT: -+ ainfo_tmp = ainfo->ai_next; -+ ainfo->ai_next = ainfo_reconnect; -+ ainfo_reconnect->ai_next = ainfo; -+ ainfo = ainfo_tmp; -+ ainfo_old = NULL; -+ break; -+ case ADDR_WAIT: -+ /* Looks like we need to wait for the connect. */ -+ if (n_w_socks >= max_w_socks) -+ { -+ max_w_socks += 10; -+ waiting_socks= xrealloc (waiting_socks, max_w_socks -+ * sizeof(*waiting_socks)); -+ } -+ waiting_socks[n_w_socks++] = fd; -+ break; -+ case ADDR_SUCCESS: -+ break; -+ default: -+ fatal (_("Unexpected value for try_connect in net_open.")); -+ } -+ if (ainfo_old) -+ { -+ ainfo = ainfo_old->ai_next; -+ ainfo_old->ai_next = NULL; -+ freeaddrinfo (ainfo_old); -+ } -+ if (op_to_do == ADDR_SUCCESS) -+ break; -+ fd = -1; -+ } -+ ainfo0 = ainfo_reconnect; -+ ainfo_reconnect = NULL; -+ -+ if (fd != -1 || !(ainfo0 != NULL || n_w_socks != 0)) -+ break; -+ -+ do -+ { -+ struct timeval t; -+ int max_fd; -+ fd_set rset; -+ -+ /* While we wait for the connect to complete, -+ poll the UI so it can update or the user can -+ interrupt. */ -+ if (deprecated_ui_loop_hook && deprecated_ui_loop_hook (0)) -+ { -+ errno = EINTR; -+ return -1; -+ } -+ -+ /* Check for timeout. */ -+ if (polls > tcp_retry_limit * POLL_INTERVAL) -+ { -+ errno = ETIMEDOUT; -+ return -1; -+ } -+ -+ /* Back off to polling once per second after the first POLL_INTERVAL -+ polls. */ -+ if (polls < POLL_INTERVAL) -+ { -+ t.tv_sec = 0; -+ t.tv_usec = 1000000 / POLL_INTERVAL; -+ } -+ else -+ { -+ t.tv_sec = 1; -+ t.tv_usec = 0; -+ } -+ -+ max_fd=-1; -+ if (n_w_socks) -+ { -+ int ifd; -+ -+ FD_ZERO (&rset); -+ for (ifd = 0; ifd < n_w_socks; ++ifd) -+ { -+ if (waiting_socks[ifd] != -1) -+ { -+ FD_SET (waiting_socks[ifd], &rset); -+ if (max_fd < waiting_socks[ifd]) -+ max_fd = waiting_socks[ifd]; -+ } -+ } -+ } -+ if (max_fd != -1) -+ { -+ int ifd; -+ fd_set wset, eset; -+ wset = rset; -+ eset = rset; -+ -+ /* POSIX systems return connection success or failure by signalling -+ wset. Windows systems return success in wset and failure in -+ eset. -+ -+ We must call select here, rather than gdb_select, because -+ the serial structure has not yet been initialized - the -+ MinGW select wrapper will not know that this FD refers -+ to a socket. */ -+ n = select (max_fd + 1, &rset, &wset, &eset, &t); -+ if (n > 0) -+ for (ifd = 0; ifd < n_w_socks && fd == -1; ++ifd) -+ if (FD_ISSET(waiting_socks[ifd], &rset) -+ || FD_ISSET(waiting_socks[ifd], &wset) -+ || FD_ISSET(waiting_socks[ifd], &eset)) -+ { -+ int op_to_do; -+ -+ op_to_do = check_sock_err(waiting_socks[ifd]); -+ switch (op_to_do) -+ { -+ case ADDR_RECONNECT: -+ //waiting_socks[ifd] = -1; -+ break; -+ case ADDR_DROP: -+ //waiting_socks[ifd] = -1; -+ break; -+ case ADDR_WAIT: -+ break; -+ case ADDR_SUCCESS: -+ fd = waiting_socks[ifd]; -+ break; -+ default: -+ fatal (_("Unexpected value for try_connect in net_open.")); -+ } -+ } -+ } -+ else -+ /* Use gdb_select here, since we have no file descriptors, and on -+ Windows, plain select doesn't work in that case. */ -+ n = gdb_select (0, NULL, NULL, NULL, &t); -+ -+ /* If we didn't time out, only count it as one poll. */ -+ if (n > 0 || polls < POLL_INTERVAL) -+ polls++; -+ else -+ polls += POLL_INTERVAL; -+ } -+ while (fd == -1 && n == 0 && ainfo0 == NULL); - } -+ while (fd == -1 && n >= 0); - -- /* Got something. Is it an error? */ -- { -- int res, err; -- socklen_t len; -- -- len = sizeof (err); -- /* On Windows, the fourth parameter to getsockopt is a "char *"; -- on UNIX systems it is generally "void *". The cast to "void *" -- is OK everywhere, since in C "void *" can be implicitly -- converted to any pointer type. */ -- res = getsockopt (scb->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len); -- if (res < 0 || err) -- { -- /* Maybe the target still isn't ready to accept the connection. */ -- if (tcp_auto_retry --#ifdef USE_WIN32API -- && err == WSAECONNREFUSED --#else -- && err == ECONNREFUSED --#endif -- && wait_for_connect (NULL, &polls) >= 0) -- { -- close (scb->fd); -- goto retry; -- } -- if (err) -- errno = err; -- net_close (scb); -- return -1; -- } -- } -+ freeaddrinfo (ainfo0); -+ if (waiting_socks) -+ { -+ int ifd; -+ -+ for (ifd = 0; ifd < n_w_socks && fd == -1; ++ifd) -+ if (waiting_socks[ifd] != fd && waiting_socks[ifd] != -1) -+ close (waiting_socks[ifd]); -+ } -+ free (waiting_socks); -+ -+ if (fd == -1) -+ return -1; - -+ scb->fd = fd; - /* Turn off nonblocking. */ - ioarg = 0; - ioctl (scb->fd, FIONBIO, &ioarg); diff --git a/dist/gdb/patches/pythonhome.patch b/dist/gdb/patches/pythonhome.patch deleted file mode 100644 index 97f1acf2c4..0000000000 --- a/dist/gdb/patches/pythonhome.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/gdb/python/python.c 2013-03-28 18:46:53.000000000 +0200 -+++ b/gdb/python/python.c 2013-10-27 05:28:35.761204091 +0200 -@@ -1568,6 +1568,16 @@ message == an error message without a st - #endif - #endif - -+ -+ char readlinkbuffer[BUFSIZ]; -+ int readlinks = readlink("/proc/self/exe", readlinkbuffer, BUFSIZ - 1); -+ readlinkbuffer[readlinks] = 0; -+ char *executeablepath = dirname(readlinkbuffer); -+ char *pythonhome = malloc(strlen(executeablepath) + strlen("/python/") + 2); -+ strcpy(pythonhome, executeablepath); -+ strcat(pythonhome, "/python/"); -+ setenv("PYTHONHOME", pythonhome, 1); -+ - Py_Initialize (); - PyEval_InitThreads (); - |