Prevent segfault in GDB when searching for architecture matches

Cherry-picked from upstream:
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=5d9bbb73c1df68741048c3d0f837b50c289ea608

This fixes gdb host crash when trying to read symbols from target.
While patch is arch-neutral, we could only reproduce the issue
for mips.

	* format.c (struct bfd_preserve): New "build_id" field.
	(bfd_preserve_save): Save "build_id".
	(bfd_preserve_restore): Restore "build_id".

From https://sourceware.org/ml/gdb-patches/2016-09/msg00070.html :
  Currently the "build_id" field of "struct bfd" is not preserved by
"struct bfd_preserve" when "bfd_check_format_matches" is going through
all target vectors trying to find a compatible target vector. This leads
to a segmentation fault in GDB.

  Consider a case where one compatible target vector has already been
found (so the subset of bfd state is saved in struct bfd_preserve) and
then an attempt to find a better match fails after it has modified bfd's
build_id pointer. Since this attempt is failed, all its side effects
will be undone and all memory allocations done by this vector will be
free'd. This will eventually free the memory block that build_id pointer
is pointing to. This free'd block then gets reallocated and used for
storing something else -- leaving build_id pointing to incorrect
contents.

 This patch adds "build_id" pointer to "struct bfd_preserve" so that it
will be preserved on success which can then be recoverable on failure.

Change-Id: I3e81c3a8a1d25869659bbf99bebe8b00062cea72
2 files changed
tree: 85831808c37bcc7176da7a224e8e3cda9314d428
  1. gdb-7.11/
  2. build-gdb.sh
  3. build.py