+++ /dev/null
-2007-11-02 Jan Kratochvil <jan.kratochvil@redhat.com>
-
- Port to GDB-6.7.1.
-
-2007-11-02 Jan Kratochvil <jan.kratochvil@redhat.com>
-
- Port to post-GDB-6.7.1 multi-PC breakpoints.
-
-2007-11-09 Jan Kratochvil <jan.kratochvil@redhat.com>
-
- * solib-svr4.c (svr4_current_sos): Fix segfault on NULL EXEC_BFD.
-
-2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
-
- Port to GDB-6.8pre.
-
-2008-02-27 Jan Kratochvil <jan.kratochvil@redhat.com>
-
- Port to gdb-6.7.50.20080227.
-
-2008-06-01 Jan Kratochvil <jan.kratochvil@redhat.com>
-
- Fix crash on a watchpoint update on an inferior stop.
-
-2008-09-01 Jan Kratochvil <jan.kratochvil@redhat.com>
-
- Fix scan_dyntag() for binaries provided by valgrind (BZ 460319).
-
-Index: gdb-6.8.91.20090925/gdb/amd64-tdep.c
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/amd64-tdep.c 2009-09-25 10:25:39.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/amd64-tdep.c 2009-09-25 10:25:45.000000000 +0200
-@@ -36,6 +36,7 @@
- #include "regcache.h"
- #include "regset.h"
- #include "symfile.h"
-+#include "exceptions.h"
-
- #include "gdb_assert.h"
-
-@@ -1591,18 +1592,31 @@ amd64_analyze_stack_align (CORE_ADDR pc,
- Any function that doesn't start with this sequence will be assumed
- to have no prologue and thus no valid frame pointer in %rbp. */
-
--static CORE_ADDR
--amd64_analyze_prologue (struct gdbarch *gdbarch,
-- CORE_ADDR pc, CORE_ADDR current_pc,
-- struct amd64_frame_cache *cache)
-+struct amd64_analyze_prologue_data
-+ {
-+ struct gdbarch *gdbarch;
-+ CORE_ADDR pc, current_pc;
-+ struct amd64_frame_cache *cache;
-+ CORE_ADDR retval;
-+ };
-+
-+static int
-+amd64_analyze_prologue_1 (void *data_pointer)
- {
-+ struct amd64_analyze_prologue_data *data = data_pointer;
-+ struct gdbarch *gdbarch = data->gdbarch;
-+ CORE_ADDR pc = data->pc, current_pc = data->current_pc;
-+ struct amd64_frame_cache *cache = data->cache;
- enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
- static gdb_byte proto[3] = { 0x48, 0x89, 0xe5 }; /* movq %rsp, %rbp */
- gdb_byte buf[3];
- gdb_byte op;
-
- if (current_pc <= pc)
-- return current_pc;
-+ {
-+ data->retval = current_pc;
-+ return 1;
-+ }
-
- pc = amd64_analyze_stack_align (pc, current_pc, cache);
-
-@@ -1617,18 +1631,59 @@ amd64_analyze_prologue (struct gdbarch *
-
- /* If that's all, return now. */
- if (current_pc <= pc + 1)
-- return current_pc;
-+ {
-+ data->retval = current_pc;
-+ return 1;
-+ }
-
- /* Check for `movq %rsp, %rbp'. */
- read_memory (pc + 1, buf, 3);
- if (memcmp (buf, proto, 3) != 0)
-- return pc + 1;
-+ {
-+ data->retval = pc + 1;
-+ return 1;
-+ }
-
- /* OK, we actually have a frame. */
- cache->frameless_p = 0;
-- return pc + 4;
-+ data->retval = pc + 4;
-+ return 1;
- }
-
-+ data->retval = pc;
-+ return 1;
-+}
-+
-+/* Catch memory read errors and return just PC in such case.
-+ It occurs very early on enable_break->new_symfile_objfile->
-+ ->breakpoint_re_set->decode_line_1->decode_variable_1->
-+ ->find_function_start_sal */
-+
-+static CORE_ADDR
-+amd64_analyze_prologue (struct gdbarch *gdbarch,
-+ CORE_ADDR pc, CORE_ADDR current_pc,
-+ struct amd64_frame_cache *cache)
-+{
-+ int status;
-+ struct amd64_analyze_prologue_data data;
-+ struct ui_file *saved_gdb_stderr;
-+
-+ /* Suppress error messages. */
-+ saved_gdb_stderr = gdb_stderr;
-+ gdb_stderr = ui_file_new ();
-+
-+ data.gdbarch = gdbarch;
-+ data.pc = pc;
-+ data.current_pc = current_pc;
-+ data.cache = cache;
-+ status = catch_errors (amd64_analyze_prologue_1, &data, "", RETURN_MASK_ALL);
-+
-+ /* Stop suppressing error messages. */
-+ ui_file_delete (gdb_stderr);
-+ gdb_stderr = saved_gdb_stderr;
-+
-+ if (status)
-+ return data.retval;
- return pc;
- }
-
-Index: gdb-6.8.91.20090925/gdb/auxv.c
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/auxv.c 2009-07-02 19:25:52.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/auxv.c 2009-09-25 10:25:45.000000000 +0200
-@@ -78,7 +78,7 @@ procfs_xfer_auxv (struct target_ops *ops
- Return 1 if an entry was read into *TYPEP and *VALP. */
- static int
- default_auxv_parse (struct target_ops *ops, gdb_byte **readptr,
-- gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
-+ gdb_byte *endptr, ULONGEST *typep, CORE_ADDR *valp)
- {
- const int sizeof_auxv_field = gdbarch_ptr_bit (target_gdbarch)
- / TARGET_CHAR_BIT;
-@@ -106,7 +106,7 @@ default_auxv_parse (struct target_ops *o
- Return 1 if an entry was read into *TYPEP and *VALP. */
- int
- target_auxv_parse (struct target_ops *ops, gdb_byte **readptr,
-- gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
-+ gdb_byte *endptr, ULONGEST *typep, CORE_ADDR *valp)
- {
- struct target_ops *t;
- for (t = ops; t != NULL; t = t->beneath)
-@@ -121,9 +121,10 @@ target_auxv_parse (struct target_ops *op
- an error getting the information. On success, return 1 after
- storing the entry's value field in *VALP. */
- int
--target_auxv_search (struct target_ops *ops, CORE_ADDR match, CORE_ADDR *valp)
-+target_auxv_search (struct target_ops *ops, ULONGEST match, CORE_ADDR *valp)
- {
-- CORE_ADDR type, val;
-+ CORE_ADDR val;
-+ ULONGEST at_type;
- gdb_byte *data;
- LONGEST n = target_read_alloc (ops, TARGET_OBJECT_AUXV, NULL, &data);
- gdb_byte *ptr = data;
-@@ -133,10 +134,10 @@ target_auxv_search (struct target_ops *o
- return n;
-
- while (1)
-- switch (target_auxv_parse (ops, &ptr, data + n, &type, &val))
-+ switch (target_auxv_parse (ops, &ptr, data + n, &at_type, &val))
- {
- case 1: /* Here's an entry, check it. */
-- if (type == match)
-+ if (at_type == match)
- {
- xfree (data);
- *valp = val;
-@@ -159,7 +160,8 @@ target_auxv_search (struct target_ops *o
- int
- fprint_target_auxv (struct ui_file *file, struct target_ops *ops)
- {
-- CORE_ADDR type, val;
-+ CORE_ADDR val;
-+ ULONGEST at_type;
- gdb_byte *data;
- LONGEST len = target_read_alloc (ops, TARGET_OBJECT_AUXV, NULL,
- &data);
-@@ -169,13 +171,13 @@ fprint_target_auxv (struct ui_file *file
- if (len <= 0)
- return len;
-
-- while (target_auxv_parse (ops, &ptr, data + len, &type, &val) > 0)
-+ while (target_auxv_parse (ops, &ptr, data + len, &at_type, &val) > 0)
- {
- const char *name = "???";
- const char *description = "";
- enum { dec, hex, str } flavor = hex;
-
-- switch (type)
-+ switch (at_type)
- {
- #define TAG(tag, text, kind) \
- case tag: name = #tag; description = text; flavor = kind; break
-@@ -231,7 +233,7 @@ fprint_target_auxv (struct ui_file *file
- }
-
- fprintf_filtered (file, "%-4s %-20s %-30s ",
-- plongest (type), name, description);
-+ plongest (at_type), name, description);
- switch (flavor)
- {
- case dec:
-@@ -253,7 +255,7 @@ fprint_target_auxv (struct ui_file *file
- break;
- }
- ++ents;
-- if (type == AT_NULL)
-+ if (at_type == AT_NULL)
- break;
- }
-
-Index: gdb-6.8.91.20090925/gdb/auxv.h
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/auxv.h 2009-06-07 21:07:08.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/auxv.h 2009-09-25 10:25:45.000000000 +0200
-@@ -31,14 +31,14 @@
- Return 1 if an entry was read into *TYPEP and *VALP. */
- extern int target_auxv_parse (struct target_ops *ops,
- gdb_byte **readptr, gdb_byte *endptr,
-- CORE_ADDR *typep, CORE_ADDR *valp);
-+ ULONGEST *typep, CORE_ADDR *valp);
-
- /* Extract the auxiliary vector entry with a_type matching MATCH.
- Return zero if no such entry was found, or -1 if there was
- an error getting the information. On success, return 1 after
- storing the entry's value field in *VALP. */
- extern int target_auxv_search (struct target_ops *ops,
-- CORE_ADDR match, CORE_ADDR *valp);
-+ ULONGEST match, CORE_ADDR *valp);
-
- /* Print the contents of the target's AUXV on the specified file. */
- extern int fprint_target_auxv (struct ui_file *file, struct target_ops *ops);
-Index: gdb-6.8.91.20090925/gdb/dwarf2read.c
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/dwarf2read.c 2009-09-25 10:25:39.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/dwarf2read.c 2009-09-25 10:25:45.000000000 +0200
-@@ -1717,7 +1717,7 @@ dwarf2_build_psymtabs (struct objfile *o
- dwarf2_read_section (objfile, &dwarf2_per_objfile->eh_frame);
- dwarf2_read_section (objfile, &dwarf2_per_objfile->frame);
-
-- if (mainline
-+ if ((mainline == 1)
- || (objfile->global_psymbols.size == 0
- && objfile->static_psymbols.size == 0))
- {
-Index: gdb-6.8.91.20090925/gdb/elfread.c
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/elfread.c 2009-09-25 10:25:38.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/elfread.c 2009-09-25 10:25:45.000000000 +0200
-@@ -681,7 +681,7 @@ elf_symfile_read (struct objfile *objfil
- /* If we are reinitializing, or if we have never loaded syms yet,
- set table to empty. MAINLINE is cleared so that *_read_psymtab
- functions do not all also re-initialize the psymbol table. */
-- if (mainline)
-+ if (mainline == 1)
- {
- init_psymbol_list (objfile, 0);
- mainline = 0;
-Index: gdb-6.8.91.20090925/gdb/infrun.c
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/infrun.c 2009-09-25 10:25:39.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/infrun.c 2009-09-25 10:25:45.000000000 +0200
-@@ -3659,6 +3659,10 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME (
- #endif
- target_terminal_inferior ();
-
-+ /* For PIE executables, we dont really know where the
-+ breakpoints are going to be until we start up the inferior. */
-+ enable_breakpoints_after_startup ();
-+
- /* If requested, stop when the dynamic linker notifies
- gdb of events. This allows the user to get control
- and place breakpoints in initializer routines for
-Index: gdb-6.8.91.20090925/gdb/objfiles.c
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/objfiles.c 2009-09-25 10:25:38.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/objfiles.c 2009-09-25 10:25:45.000000000 +0200
-@@ -53,6 +53,9 @@
- #include "observer.h"
- #include "complaints.h"
-
-+#include "auxv.h"
-+#include "elf/common.h"
-+
- /* Prototypes for local functions */
-
- static void objfile_alloc_data (struct objfile *objfile);
-@@ -280,9 +283,17 @@ init_entry_point_info (struct objfile *o
- CORE_ADDR
- entry_point_address (void)
- {
-+ int ret;
-+
- struct gdbarch *gdbarch;
- CORE_ADDR entry_point;
-
-+ /* Find the address of the entry point of the program from the
-+ auxv vector. */
-+ ret = target_auxv_search (¤t_target, AT_ENTRY, &entry_point);
-+ if (ret == 1)
-+ return entry_point;
-+
- if (symfile_objfile == NULL)
- return 0;
-
-Index: gdb-6.8.91.20090925/gdb/solib-svr4.c
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/solib-svr4.c 2009-09-25 10:25:39.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/solib-svr4.c 2009-09-25 10:28:07.000000000 +0200
-@@ -47,6 +47,7 @@
- #include "exec.h"
- #include "auxv.h"
- #include "exceptions.h"
-+#include "command.h"
-
- static struct link_map_offsets *svr4_fetch_link_map_offsets (void);
- static int svr4_have_link_map_offsets (void);
-@@ -359,7 +360,9 @@ solib_svr4_inferior_exit (int pid)
-
- /* Local function prototypes */
-
-+#if 0
- static int match_main (char *);
-+#endif
-
- static CORE_ADDR bfd_lookup_symbol (bfd *, char *);
-
-@@ -600,10 +603,12 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
- int arch_size, step, sect_size;
- long dyn_tag;
- CORE_ADDR dyn_ptr, dyn_addr;
-+ CORE_ADDR reloc_addr = 0;
- gdb_byte *bufend, *bufstart, *buf;
- Elf32_External_Dyn *x_dynp_32;
- Elf64_External_Dyn *x_dynp_64;
- struct bfd_section *sect;
-+ int ret;
-
- if (abfd == NULL)
- return 0;
-@@ -615,19 +620,81 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
- if (arch_size == -1)
- return 0;
-
-+ /* The auxv vector based relocatable files reading is limited to the main
-+ executable. */
-+ gdb_assert (abfd == exec_bfd || ptr == NULL);
-+
-+ if (ptr != NULL)
-+ {
-+ CORE_ADDR entry_addr;
-+
-+ /* Find the address of the entry point of the program from the
-+ auxv vector. */
-+ ret = target_auxv_search (¤t_target, AT_ENTRY, &entry_addr);
-+
-+ if (ret == 0 || ret == -1)
-+ {
-+ /* No auxv info, maybe an older kernel. Fake our way through. */
-+ entry_addr = bfd_get_start_address (exec_bfd);
-+
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: program entry address not found. Using bfd's %s for %s\n",
-+ paddress (target_gdbarch, entry_addr), exec_bfd->filename);
-+ }
-+ else
-+ {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: found program entry address %s for %s\n",
-+ paddress (target_gdbarch, entry_addr), exec_bfd->filename);
-+ }
-+ reloc_addr = entry_addr - bfd_get_start_address (exec_bfd);
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: expected relocation offset %s for %s\n",
-+ paddress (target_gdbarch, reloc_addr), exec_bfd->filename);
-+ }
-+
- /* Find the start address of the .dynamic section. */
- sect = bfd_get_section_by_name (abfd, ".dynamic");
- if (sect == NULL)
-- return 0;
-+ {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: .dynamic section not found in %s -- return now\n",
-+ exec_bfd->filename);
-+ return 0;
-+ }
-+ else
-+ {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: .dynamic section found in %s\n",
-+ exec_bfd->filename);
-+ }
-+
- dyn_addr = bfd_section_vma (abfd, sect);
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: .dynamic addr %s\n",
-+ paddress (target_gdbarch, dyn_addr));
-
- /* Read in .dynamic from the BFD. We will get the actual value
- from memory later. */
- sect_size = bfd_section_size (abfd, sect);
- buf = bufstart = alloca (sect_size);
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: read in .dynamic section\n");
- if (!bfd_get_section_contents (abfd, sect,
- buf, 0, sect_size))
-- return 0;
-+ {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: couldn't read .dynamic section -- return now\n");
-+ return 0;
-+ }
-
- /* Iterate over BUF and scan for DYNTAG. If found, set PTR and return. */
- step = (arch_size == 32) ? sizeof (Elf32_External_Dyn)
-@@ -648,26 +715,105 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
- dyn_tag = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_tag);
- dyn_ptr = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_un.d_ptr);
- }
-- if (dyn_tag == DT_NULL)
-+
-+ /* Verify RELOC_ADDR makes sense - it does not have to for valgrind which
-+ supplies us a specially crafted executable in /proc/PID/fd/X while
-+ /proc/PID/auxv corresponds to a different executable (.../memcheck). */
-+ if (reloc_addr)
-+ {
-+ gdb_byte tag_buf[8];
-+ CORE_ADDR tag_addr;
-+
-+ tag_addr = dyn_addr + (buf - bufstart) + reloc_addr;
-+ if (target_read_memory (tag_addr, tag_buf, arch_size / 8) == 0)
-+ {
-+ if (memcmp (tag_buf, buf, arch_size / 8) != 0)
-+ {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: tag at offset 0x%lx does not match,"
-+ " dropping relocation offset %s\n",
-+ (unsigned long) (buf - bufstart), paddress (target_gdbarch, reloc_addr));
-+ reloc_addr = 0;
-+ }
-+ }
-+ else
-+ {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: tag at offset 0x%lx is not readable,"
-+ " dropping relocation offset %s\n",
-+ (unsigned long) (buf - bufstart), paddress (target_gdbarch, reloc_addr));
-+ reloc_addr = 0;
-+ }
-+ }
-+
-+ if (dyn_tag == DT_NULL)
- return 0;
-- if (dyn_tag == dyntag)
-- {
-- /* If requested, try to read the runtime value of this .dynamic
-- entry. */
-- if (ptr)
-- {
-- struct type *ptr_type;
-- gdb_byte ptr_buf[8];
-- CORE_ADDR ptr_addr;
--
-- ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
-- ptr_addr = dyn_addr + (buf - bufstart) + arch_size / 8;
-- if (target_read_memory (ptr_addr, ptr_buf, arch_size / 8) == 0)
-- dyn_ptr = extract_typed_address (ptr_buf, ptr_type);
-- *ptr = dyn_ptr;
-- }
-- return 1;
-- }
-+ if (dyn_tag == dyntag)
-+ {
-+ /* If requested, try to read the runtime value of this .dynamic
-+ entry. */
-+ if (ptr)
-+ {
-+ gdb_byte ptr_buf[8];
-+ CORE_ADDR ptr_addr;
-+ int got;
-+
-+ ptr_addr = dyn_addr + (buf - bufstart) + arch_size / 8;
-+ if (ptr != NULL)
-+ {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: unrelocated ptr addr %s\n",
-+ paddress (target_gdbarch, ptr_addr));
-+ ptr_addr += reloc_addr;
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: relocated ptr addr %s"
-+ " (relocation offset %s) for %s\n",
-+ paddress (target_gdbarch, ptr_addr), paddress (target_gdbarch, reloc_addr),
-+ exec_bfd->filename);
-+ }
-+ got = target_read_memory (ptr_addr, ptr_buf, arch_size / 8);
-+ if (got != 0 && reloc_addr)
-+ {
-+ ptr_addr -= reloc_addr;
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: unrelocated back to ptr addr %s"
-+ " as the memory was unreable for %s\n",
-+ paddress (target_gdbarch, ptr_addr), exec_bfd->filename);
-+ got = target_read_memory (ptr_addr, ptr_buf, arch_size / 8);
-+ }
-+
-+ if (got == 0)
-+ {
-+ struct type *ptr_type;
-+
-+ ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
-+ dyn_ptr = extract_typed_address (ptr_buf, ptr_type);
-+ if (ptr != NULL)
-+ {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: Tag entry has value %s -- return now\n",
-+ paddress (target_gdbarch, dyn_ptr));
-+ }
-+ }
-+ else
-+ {
-+ if (ptr != NULL)
-+ {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "elf_locate_base: Couldn't read tag entry value -- return now\n");
-+ }
-+ }
-+ *ptr = dyn_ptr;
-+ }
-+ return 1;
-+ }
- }
-
- return 0;
-@@ -1040,6 +1186,11 @@ svr4_current_sos (void)
- CORE_ADDR ldsomap = 0;
- struct inferior *inf;
- struct svr4_info *info;
-+ const char *filename = exec_bfd ? exec_bfd->filename : "<none>";
-+
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_current_sos: exec_bfd %s\n", filename);
-
- if (ptid_equal (inferior_ptid, null_ptid))
- return NULL;
-@@ -1054,7 +1205,13 @@ svr4_current_sos (void)
- /* If we can't find the dynamic linker's base structure, this
- must not be a dynamically linked executable. Hmm. */
- if (! info->debug_base)
-- return svr4_default_sos ();
-+ {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_current_sos: no DT_DEBUG found in %s -- return now\n",
-+ filename);
-+ return svr4_default_sos ();
-+ }
-
- /* Walk the inferior's link map list, and build our list of
- `struct so_list' nodes. */
-@@ -1074,26 +1231,104 @@ svr4_current_sos (void)
- new->lm_info->lm = xzalloc (lmo->link_map_size);
- make_cleanup (xfree, new->lm_info->lm);
-
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_current_sos: read lm at %s\n", paddress (target_gdbarch, lm));
- read_memory (lm, new->lm_info->lm, lmo->link_map_size);
-
- lm = LM_NEXT (new);
-
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_current_sos: is first link entry? %d\n",
-+ IGNORE_FIRST_LINK_MAP_ENTRY (new));
-+
- /* For SVR4 versions, the first entry in the link map is for the
- inferior executable, so we must ignore it. For some versions of
- SVR4, it has no name. For others (Solaris 2.3 for example), it
- does have a name, so we can no longer use a missing name to
- decide when to ignore it. */
-- if (IGNORE_FIRST_LINK_MAP_ENTRY (new) && ldsomap == 0)
-+ if (exec_bfd != NULL && IGNORE_FIRST_LINK_MAP_ENTRY (new) && ldsomap == 0)
- {
-- info->main_lm_addr = new->lm_info->lm_addr;
-- free_so (new);
-- }
-+ /* It is the first link map entry, i.e. it is the main executable. */
-+
-+ if (bfd_get_start_address (exec_bfd) == entry_point_address ())
-+ {
-+ /* Non-pie case, main executable has not been relocated. */
-+ info->main_lm_addr = new->lm_info->lm_addr;
-+ free_so (new);
-+ }
-+ else
-+ {
-+ /* Pie case, main executable has been relocated. */
-+ struct so_list *gdb_solib;
-+
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_current_sos: Processing first link map entry\n");
-+ strncpy (new->so_name, exec_bfd->filename,
-+ SO_NAME_MAX_PATH_SIZE - 1);
-+ new->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
-+ strcpy (new->so_original_name, new->so_name);
-+ /*new->main = 1;*/
-+ new->main_relocated = 0;
-+
-+ if (debug_solib)
-+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_current_sos: Processing nameless DSO\n");
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_current_sos: adding name %s\n",
-+ new->so_name);
-+ }
-+
-+ for (gdb_solib = master_so_list ();
-+ gdb_solib;
-+ gdb_solib = gdb_solib->next)
-+ {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_current_sos: compare gdb %s and new %s\n",
-+ gdb_solib->so_name, new->so_name);
-+ if (strcmp (gdb_solib->so_name, new->so_name) == 0)
-+ if (gdb_solib->main_relocated)
-+ {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_current_sos: found main relocated\n");
-+ break;
-+ }
-+ }
-+
-+ if ((gdb_solib && !gdb_solib->main_relocated) || (!gdb_solib))
-+ {
-+ add_to_target_sections (0 /*from_tty*/, ¤t_target, new);
-+ new->main = 1;
-+ }
-+
-+ /* We need this in the list of shared libs we return because
-+ solib_add_stub will loop through it and add the symbol file. */
-+ new->next = 0;
-+ *link_ptr = new;
-+ link_ptr = &new->next;
-+ }
-+ } /* End of IGNORE_FIRST_LINK_MAP_ENTRY */
- else
- {
-+ /* This is not the first link map entry, i.e. is not the main
-+ executable. Note however that it could be the DSO supplied on
-+ certain systems (i.e. Linux 2.6) containing information about
-+ the vsyscall page. We must ignore such entry. This entry is
-+ nameless (just like the one for the main executable, sigh). */
-+
- int errcode;
- char *buffer;
-
- /* Extract this shared object's name. */
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_current_sos: read LM_NAME\n");
-+
- target_read_string (LM_NAME (new), &buffer,
- SO_NAME_MAX_PATH_SIZE - 1, &errcode);
- if (errcode != 0)
-@@ -1101,63 +1336,76 @@ svr4_current_sos (void)
- safe_strerror (errcode));
- else
- {
-- 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 (LM_DYNAMIC_FROM_LINK_MAP (new));
-- if (build_id != NULL)
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_current_sos: LM_NAME is <%s>\n",
-+ buffer);
-+ /* The name could be empty, in which case it is the
-+ system supplied DSO. */
-+ if (strcmp (buffer, "") == 0)
-+ free_so (new);
-+ else
- {
-- char *name, *build_id_filename;
-+ 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);
-
-- /* 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)
-+ build_id = build_id_addr_get (LM_DYNAMIC_FROM_LINK_MAP (new));
-+ if (build_id != NULL)
- {
-- strncpy (new->so_name, name, SO_NAME_MAX_PATH_SIZE - 1);
-- new->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
-- xfree (name);
-+ 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);
- }
-- 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;
-+ if (debug_solib)
-+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_current_sos: Processing DSO: %s\n",
-+ new->so_name);
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_current_sos: first link entry %d\n",
-+ IGNORE_FIRST_LINK_MAP_ENTRY (new));
- }
-
-- xfree (build_id_filename);
-- xfree (build_id);
-+ new->next = 0;
-+ *link_ptr = new;
-+ link_ptr = &new->next;
- }
- }
-- xfree (buffer);
--
-- /* If this entry has no name, or its name matches the name
-- for the main executable, don't include it in the list. */
-- if (! new->so_name[0]
-- || match_main (new->so_name))
-- free_so (new);
-- else
-- {
-- new->next = 0;
-- *link_ptr = new;
-- link_ptr = &new->next;
-- }
-+ xfree (buffer);
- }
-
- /* On Solaris, the dynamic linker is not in the normal list of
-@@ -1173,6 +1421,9 @@ svr4_current_sos (void)
- if (head == NULL)
- return svr4_default_sos ();
-
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog, "svr4_current_sos: ENDS %s\n", filename);
-+
- return head;
- }
-
-@@ -1205,7 +1456,7 @@ svr4_fetch_objfile_link_map (struct objf
- /* On some systems, the only way to recognize the link map entry for
- the main executable file is by looking at its name. Return
- non-zero iff SONAME matches one of the known main executable names. */
--
-+#if 0
- static int
- match_main (char *soname)
- {
-@@ -1219,6 +1470,7 @@ match_main (char *soname)
-
- return (0);
- }
-+#endif
-
- /* Return 1 if PC lies in the dynamic symbol resolution code of the
- SVR4 run time loader. */
-@@ -1370,15 +1622,29 @@ enable_break (struct svr4_info *info)
- /* Find the program interpreter; if not found, warn the user and drop
- into the old breakpoint at symbol code. */
- interp_name = find_program_interpreter ();
-+
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "enable_break: search for .interp in %s\n",
-+ exec_bfd->filename);
- if (interp_name)
- {
- CORE_ADDR load_addr = 0;
-+ CORE_ADDR load_addr_mask = -1L;
- int load_addr_found = 0;
- int loader_found_in_list = 0;
- struct so_list *so;
- bfd *tmp_bfd = NULL;
- struct target_ops *tmp_bfd_target;
- volatile struct gdb_exception ex;
-+ int arch_size;
-+
-+ /* For 32bit inferiors with 64bit GDB we may get LOAD_ADDR at 0xff......
-+ and thus overflowing its addition to the address while CORE_ADDR is
-+ 64bit producing 0x1........ address invalid across GDB. */
-+ arch_size = bfd_get_arch_size (exec_bfd);
-+ if (arch_size > 0 && arch_size < sizeof (1UL) * 8)
-+ load_addr_mask = (1UL << arch_size) - 1;
-
- sym_addr = 0;
-
-@@ -1395,6 +1661,9 @@ enable_break (struct svr4_info *info)
- {
- tmp_bfd = solib_bfd_open (interp_name);
- }
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "enable_break: opening %s\n", interp_name);
- if (tmp_bfd == NULL)
- goto bkpt_at_symbol;
-
-@@ -1452,16 +1721,16 @@ enable_break (struct svr4_info *info)
- interp_sect = bfd_get_section_by_name (tmp_bfd, ".text");
- if (interp_sect)
- {
-- interp_text_sect_low =
-- bfd_section_vma (tmp_bfd, interp_sect) + load_addr;
-+ interp_text_sect_low = (bfd_section_vma (tmp_bfd, interp_sect)
-+ + load_addr) & load_addr_mask;
- interp_text_sect_high =
- interp_text_sect_low + bfd_section_size (tmp_bfd, interp_sect);
- }
- interp_sect = bfd_get_section_by_name (tmp_bfd, ".plt");
- if (interp_sect)
- {
-- interp_plt_sect_low =
-- bfd_section_vma (tmp_bfd, interp_sect) + load_addr;
-+ interp_plt_sect_low = (bfd_section_vma (tmp_bfd, interp_sect)
-+ + load_addr) & load_addr_mask;
- interp_plt_sect_high =
- interp_plt_sect_low + bfd_section_size (tmp_bfd, interp_sect);
- }
-@@ -1496,7 +1765,7 @@ enable_break (struct svr4_info *info)
-
- if (sym_addr != 0)
- {
-- create_solib_event_breakpoint (target_gdbarch, load_addr + sym_addr);
-+ create_solib_event_breakpoint (target_gdbarch, (load_addr + sym_addr) & load_addr_mask);
- xfree (interp_name);
- return 1;
- }
-@@ -1769,6 +2038,9 @@ svr4_solib_create_inferior_hook (void)
- while (tp->stop_signal != TARGET_SIGNAL_TRAP);
- inf->stop_soon = NO_STOP_QUIETLY;
- #endif /* defined(_SCO_DS) */
-+
-+ if (bfd_get_start_address (exec_bfd) != entry_point_address ())
-+ disable_breakpoints_before_startup ();
- }
-
- static void
-@@ -1945,6 +2217,76 @@ svr4_lp64_fetch_link_map_offsets (void)
-
- return lmp;
- }
-+void
-+info_linkmap_command (char *cmd, int from_tty)
-+{
-+ CORE_ADDR lm;
-+ struct svr4_info *info = get_svr4_info (PIDGET (inferior_ptid));
-+
-+ /* Make sure we've looked up the inferior's dynamic linker's base
-+ structure. */
-+ if (! info->debug_base)
-+ {
-+ info->debug_base = locate_base (info);
-+
-+ /* If we can't find the dynamic linker's base structure, this
-+ must not be a dynamically linked executable. Hmm. */
-+ if (! info->debug_base)
-+ {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_print_linkmap: no DT_DEBUG found in %s -- return now\n",
-+ exec_bfd->filename);
-+ return;
-+ }
-+ }
-+
-+ /* Walk the inferior's link map list, and print the info. */
-+
-+ lm = solib_svr4_r_map (info);
-+ while (lm)
-+ {
-+ int errcode;
-+ char *buffer;
-+ CORE_ADDR load_addr;
-+
-+ struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
-+ struct so_list *new
-+ = (struct so_list *) xmalloc (sizeof (struct so_list));
-+ struct cleanup *old_chain = make_cleanup (xfree, new);
-+
-+ memset (new, 0, sizeof (*new));
-+
-+ new->lm_info = xmalloc (sizeof (struct lm_info));
-+ make_cleanup (xfree, new->lm_info);
-+
-+ new->lm_info->lm = xmalloc (lmo->link_map_size);
-+ make_cleanup (xfree, new->lm_info->lm);
-+ memset (new->lm_info->lm, 0, lmo->link_map_size);
-+
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "svr4_print_linkmap: read lm at %s\n", paddress (target_gdbarch, lm));
-+ read_memory (lm, new->lm_info->lm, lmo->link_map_size);
-+
-+ lm = LM_NEXT (new);
-+
-+ /* Load address. */
-+ load_addr = LM_ADDR_CHECK (new, NULL);
-+ /* Shared object's name. */
-+ target_read_string (LM_NAME (new), &buffer,
-+ SO_NAME_MAX_PATH_SIZE - 1, &errcode);
-+ make_cleanup (xfree, buffer);
-+ if (errcode != 0)
-+ {
-+ warning ("svr4_print_linkmap: Can't read pathname for load map: %s\n",
-+ safe_strerror (errcode));
-+ }
-+ fprintf_filtered (gdb_stdout, "%-8s %-30s\n", paddress (target_gdbarch, load_addr), buffer);
-+ do_cleanups (old_chain);
-+ }
-+}
-+
- \f
-
- struct target_so_ops svr4_so_ops;
-@@ -1985,4 +2327,7 @@ _initialize_svr4_solib (void)
- svr4_so_ops.same = svr4_same;
-
- observer_attach_inferior_exit (solib_svr4_inferior_exit);
-+
-+ add_info ("linkmap", info_linkmap_command,
-+ "Display the inferior's linkmap.");
- }
-Index: gdb-6.8.91.20090925/gdb/solib.c
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/solib.c 2009-09-25 10:25:38.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/solib.c 2009-09-25 10:25:45.000000000 +0200
-@@ -82,6 +82,8 @@ set_solib_ops (struct gdbarch *gdbarch,
-
- /* external data declarations */
-
-+int debug_solib;
-+
- /* FIXME: gdbarch needs to control this variable, or else every
- configuration needs to call set_solib_ops. */
- struct target_so_ops *current_target_so_ops;
-@@ -105,6 +107,8 @@ The search path for loading non-absolute
- value);
- }
-
-+void add_to_target_sections (int, struct target_ops *, struct so_list *);
-+
- /*
-
- GLOBAL FUNCTION
-@@ -449,14 +453,38 @@ symbol_add_stub (struct so_list *so, int
- /* Have we already loaded this shared object? */
- ALL_OBJFILES (so->objfile)
- {
-- if (strcmp (so->objfile->name, so->so_name) == 0)
-+ /* Found an already loaded shared library. */
-+ if (strcmp (so->objfile->name, so->so_name) == 0
-+ && !so->main)
-+ return;
-+ /* Found an already loaded main executable. This could happen in
-+ two circumstances.
-+ First case: the main file has already been read in
-+ as the first thing that gdb does at startup, and the file
-+ hasn't been relocated properly yet. Therefor we need to read
-+ it in with the proper section info.
-+ Second case: it has been read in with the correct relocation,
-+ and therefore we need to skip it. */
-+ if (strcmp (so->objfile->name, so->so_name) == 0
-+ && so->main
-+ && so->main_relocated)
- return;
- }
-
- sap = build_section_addr_info_from_section_table (so->sections,
- so->sections_end);
-
-- so->objfile = symbol_file_add_from_bfd (so->abfd, flags, sap, OBJF_SHARED);
-+ if (so->main)
-+ {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "symbol_add_stub: adding symbols for main\n");
-+ so->objfile = symbol_file_add_from_bfd (so->abfd, (flags & ~SYMFILE_VERBOSE) | SYMFILE_MAINLINE, sap, 0);
-+ so->main_relocated = 1;
-+ }
-+ else
-+ so->objfile = symbol_file_add_from_bfd (so->abfd, flags, sap, OBJF_SHARED);
-+
- free_section_addr_info (sap);
-
- return;
-@@ -596,6 +624,10 @@ update_solib_list (int from_tty, struct
- }
- else
- {
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "update_solib_list: compare gdb:%s and inferior:%s\n",
-+ gdb->so_original_name, i->so_original_name);
- if (! strcmp (gdb->so_original_name, i->so_original_name))
- break;
- }
-@@ -650,18 +682,7 @@ update_solib_list (int from_tty, struct
- /* Fill in the rest of each of the `struct so_list' nodes. */
- for (i = inferior; i; i = i->next)
- {
-- i->from_tty = from_tty;
--
-- /* Fill in the rest of the `struct so_list' node. */
-- catch_errors (solib_map_sections, i,
-- "Error while mapping shared library sections:\n",
-- RETURN_MASK_ALL);
--
-- /* Add the shared object's sections to the current set of
-- file section tables. Do this immediately after mapping
-- the object so that later nodes in the list can query this
-- object, as is needed in solib-osf.c. */
-- add_target_sections (i->sections, i->sections_end);
-+ add_to_target_sections (from_tty, target, i);
-
- /* Notify any observer that the shared object has been
- loaded now that we've added it to GDB's tables. */
-@@ -771,6 +792,32 @@ solib_add (char *pattern, int from_tty,
- }
- }
-
-+void
-+add_to_target_sections (int from_tty, struct target_ops *target, struct so_list *solib)
-+{
-+ /* If this is set, then the sections have been already added to the
-+ target list. */
-+ if (solib->main)
-+ return;
-+
-+ solib->from_tty = from_tty;
-+
-+ /* Fill in the rest of the `struct so_list' node. */
-+ catch_errors (solib_map_sections, solib,
-+ "Error while mapping shared library sections:\n",
-+ RETURN_MASK_ALL);
-+
-+ if (debug_solib)
-+ fprintf_unfiltered (gdb_stdlog,
-+ "add_to_target_sections: add %s to to_sections\n",
-+ solib->so_original_name);
-+
-+ /* Add the shared object's sections to the current set of
-+ file section tables. Do this immediately after mapping
-+ the object so that later nodes in the list can query this
-+ object, as is needed in solib-osf.c. */
-+ add_target_sections (solib->sections, solib->sections_end);
-+}
-
- /*
-
-@@ -1189,4 +1236,12 @@ This takes precedence over the environme
- reload_shared_libraries,
- show_solib_search_path,
- &setlist, &showlist);
-+
-+ add_setshow_boolean_cmd ("solib", no_class, &debug_solib,
-+ _("\
-+Set debugging of GNU/Linux shlib module.\n"), _("\
-+Show debugging status of GNU/Linux shlib module.\n"), _("\
-+Enables printf debugging output of GNU/Linux shlib module.\n"),
-+ NULL, NULL,
-+ &setdebuglist, &showdebuglist);
- }
-Index: gdb-6.8.91.20090925/gdb/solist.h
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/solist.h 2009-09-25 10:25:38.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/solist.h 2009-09-25 10:25:45.000000000 +0200
-@@ -61,6 +61,8 @@ struct so_list
- bfd *abfd;
- char symbols_loaded; /* flag: symbols read in yet? */
- char from_tty; /* flag: print msgs? */
-+ char main; /* flag: is this the main executable? */
-+ char main_relocated; /* flag: has it been relocated yet? */
- struct objfile *objfile; /* objfile for loaded lib */
- struct target_section *sections;
- struct target_section *sections_end;
-@@ -147,4 +149,10 @@ struct symbol *solib_global_lookup (cons
- const char *name,
- const domain_enum domain);
-
-+/* Add the list of sections in so_list to the target to_sections. */
-+extern void add_to_target_sections (int, struct target_ops *, struct so_list *);
-+
-+/* Controls the printing of debugging output. */
-+extern int debug_solib;
-+
- #endif
-Index: gdb-6.8.91.20090925/gdb/symfile-mem.c
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/symfile-mem.c 2009-09-25 10:25:38.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/symfile-mem.c 2009-09-25 10:25:45.000000000 +0200
-@@ -115,7 +115,7 @@ symbol_file_add_from_memory (struct bfd
- ++i;
- }
-
-- objf = symbol_file_add_from_bfd (nbfd, from_tty ? SYMFILE_VERBOSE : 0,
-+ objf = symbol_file_add_from_bfd (nbfd, (from_tty ? SYMFILE_VERBOSE : 0) | SYMFILE_MAINLINE2_BOTH,
- sai, OBJF_SHARED);
-
- /* This might change our ideas about frames already looked at. */
-Index: gdb-6.8.91.20090925/gdb/symfile.c
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/symfile.c 2009-09-25 10:25:39.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/symfile.c 2009-09-25 10:25:45.000000000 +0200
-@@ -49,6 +49,7 @@
- #include "readline/readline.h"
- #include "gdb_assert.h"
- #include "block.h"
-+#include "varobj.h"
- #include "observer.h"
- #include "exec.h"
- #include "parser-defs.h"
-@@ -779,7 +780,7 @@ syms_from_objfile (struct objfile *objfi
-
- /* Now either addrs or offsets is non-zero. */
-
-- if (mainline)
-+ if ((add_flags & SYMFILE_MAINLINE) && !(add_flags & SYMFILE_MAINLINE2_ONLY))
- {
- /* We will modify the main symbol table, make sure that all its users
- will be cleaned up if an error occurs during symbol reading. */
-@@ -807,7 +808,7 @@ syms_from_objfile (struct objfile *objfi
-
- We no longer warn if the lowest section is not a text segment (as
- happens for the PA64 port. */
-- if (!mainline && addrs && addrs->other[0].name)
-+ if (/*!mainline &&*/ addrs && addrs->other[0].name)
- {
- asection *lower_sect;
- asection *sect;
-@@ -890,7 +891,7 @@ syms_from_objfile (struct objfile *objfi
- init_objfile_sect_indices (objfile);
- }
-
-- (*objfile->sf->sym_read) (objfile, mainline);
-+ (*objfile->sf->sym_read) (objfile, add_flags & SYMFILE_MAINLINE2_ONLY ? 2 : (add_flags & SYMFILE_MAINLINE ? 1 : 0));
-
- /* Discard cleanups as symbol reading was successful. */
-
-@@ -909,17 +910,22 @@ new_symfile_objfile (struct objfile *obj
- /* If this is the main symbol file we have to clean up all users of the
- old main symbol file. Otherwise it is sufficient to fixup all the
- breakpoints that may have been redefined by this symbol file. */
-- if (add_flags & SYMFILE_MAINLINE)
-+ if (add_flags & SYMFILE_MAINLINE && !(add_flags & SYMFILE_MAINLINE2_ONLY))
- {
- /* OK, make it the "real" symbol file. */
- symfile_objfile = objfile;
-
- clear_symtab_users ();
- }
-- else if ((add_flags & SYMFILE_DEFER_BP_RESET) == 0)
-+ else if ((add_flags & SYMFILE_DEFER_BP_RESET) == 0
-+ && (add_flags & SYMFILE_MAINLINE2_BOTH) == 0)
- {
- breakpoint_re_set ();
- }
-+ else
-+ {
-+ /* Don't reset breakpoints or it will screw up PIE. */
-+ }
-
- /* We're done reading the symbol file; finish off complaints. */
- clear_complaints (&symfile_complaints, 0, add_flags & SYMFILE_VERBOSE);
-@@ -973,7 +979,7 @@ symbol_file_add_with_addrs_or_offsets (b
- /* Give user a chance to burp if we'd be
- interactively wiping out any existing symbols. */
-
-- if ((add_flags & SYMFILE_MAINLINE)
-+ if ((add_flags & SYMFILE_MAINLINE) && !(add_flags & SYMFILE_MAINLINE2_ONLY)
- && (have_full_symbols () || have_partial_symbols ())
- && from_tty
- && (have_full_symbols () || have_partial_symbols ())
-@@ -1163,6 +1169,9 @@ symbol_file_clear (int from_tty)
- symfile_objfile->name)
- : !query (_("Discard symbol table? "))))
- error (_("Not confirmed."));
-+#ifdef CLEAR_SOLIB
-+ CLEAR_SOLIB ();
-+#endif
-
- free_all_objfiles ();
-
-@@ -3367,6 +3376,8 @@ reread_symbols (void)
- /* Discard cleanups as symbol reading was successful. */
- discard_cleanups (old_cleanups);
-
-+ init_entry_point_info (objfile);
-+
- /* If the mtime has changed between the time we set new_modtime
- and now, we *want* this to be out of date, so don't call stat
- again now. */
-Index: gdb-6.8.91.20090925/gdb/target.h
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/target.h 2009-09-25 10:25:38.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/target.h 2009-09-25 10:25:45.000000000 +0200
-@@ -545,7 +545,7 @@ struct target_ops
- Return -1 if there is insufficient buffer for a whole entry.
- Return 1 if an entry was read into *TYPEP and *VALP. */
- int (*to_auxv_parse) (struct target_ops *ops, gdb_byte **readptr,
-- gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp);
-+ gdb_byte *endptr, ULONGEST *typep, CORE_ADDR *valp);
-
- /* Search SEARCH_SPACE_LEN bytes beginning at START_ADDR for the
- sequence of bytes in PATTERN with length PATTERN_LEN.
-Index: gdb-6.8.91.20090925/gdb/symfile.h
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/symfile.h 2009-09-25 10:25:39.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/symfile.h 2009-09-25 10:25:45.000000000 +0200
-@@ -229,7 +229,13 @@ enum symfile_add_flags
- SYMFILE_MAINLINE = 1 << 2,
-
- /* Do not call breakpoint_re_set when adding this symbol file. */
-- SYMFILE_DEFER_BP_RESET = 1 << 3
-+ SYMFILE_DEFER_BP_RESET = 1 << 3,
-+
-+ /* Red Hat PIE patch: Like SYMFILE_MAINLINE but for mainline == 2.
-+ Former code was checking `if (mainline)' being satisfied both by
-+ standard 1 and rare 2, simulate it here. */
-+ SYMFILE_MAINLINE2_ONLY = 1 << 4,
-+ SYMFILE_MAINLINE2_BOTH = SYMFILE_MAINLINE2_ONLY | SYMFILE_MAINLINE
- };
-
- extern void syms_from_objfile (struct objfile *,
-Index: gdb-6.8.91.20090925/gdb/infcmd.c
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/infcmd.c 2009-09-25 10:25:39.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/infcmd.c 2009-09-25 10:25:45.000000000 +0200
-@@ -2308,6 +2308,9 @@ attach_command_post_wait (char *args, in
-
- post_create_inferior (¤t_target, from_tty);
-
-+ /* Undo the disable from post_create_inferior. */
-+ enable_breakpoints_after_startup ();
-+
- /* Install inferior's terminal modes. */
- target_terminal_inferior ();
-
-Index: gdb-6.8.91.20090925/gdb/linux-tdep.c
-===================================================================
---- gdb-6.8.91.20090925.orig/gdb/linux-tdep.c 2009-08-04 22:41:13.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/linux-tdep.c 2009-09-25 10:25:45.000000000 +0200
-@@ -163,5 +163,7 @@ in this session.\n"));
- void
- _initialize_linux_tdep (void)
- {
-+#if 0 /* gdb-6.3-pie-20050110.patch */
- observer_attach_executable_changed (check_is_pie_binary);
-+#endif
- }