* solib-svr4.c (enable_break): Add comment.
authorDoug Evans <dje@google.com>
Thu, 4 Feb 2010 22:54:41 +0000 (22:54 +0000)
committerDoug Evans <dje@google.com>
Thu, 4 Feb 2010 22:54:41 +0000 (22:54 +0000)
gdb/ChangeLog
gdb/solib-svr4.c

index 1248c2d7ada34d6302d9d31d7cb1f8f1ef660910..4fda810a805b4c3fe22ec5fb8bfedd6ef40d2cc6 100644 (file)
@@ -1,3 +1,7 @@
+2010-02-04  Doug Evans  <dje@google.com>
+
+       * solib-svr4.c (enable_break): Add comment.
+
 2010-02-04  Anthony Green  <green@moxielogic.com>
 
        * moxie-tdep.c (moxie_analyze_prologue): Fail protocol analysis
index 5689bf328dc2519dad594a4bad1b582ba1779da3..2833ed140d472c2ca151f5176fc509192fcccc31 100644 (file)
@@ -1318,6 +1318,25 @@ enable_break (struct svr4_info *info, int from_tty)
                                                              sym_addr,
                                                              &current_target));
 
+      /* On at least some versions of Solaris there's a dynamic relocation
+        on _r_debug.r_brk and SYM_ADDR may not be relocated yet, e.g., if
+        we get control before the dynamic linker has self-relocated.
+        Check if SYM_ADDR is in a known section, if it is assume we can
+        trust its value.  This is just a heuristic though, it could go away
+        or be replaced if it's getting in the way.
+
+        On ARM we need to know whether the ISA of rtld_db_dlactivity (or
+        however it's spelled in your particular system) is ARM or Thumb.
+        That knowledge is encoded in the address, if it's Thumb the low bit
+        is 1.  However, we've stripped that info above and it's not clear
+        what all the consequences are of passing a non-addr_bits_remove'd
+        address to create_solib_event_breakpoint.  The call to
+        find_pc_section verifies we know about the address and have some
+        hope of computing the right kind of breakpoint to use (via
+        symbol info).  It does mean that GDB needs to be pointed at a
+        non-stripped version of the dynamic linker in order to obtain
+        information it already knows about.  Sigh.  */
+
       os = find_pc_section (sym_addr);
       if (os != NULL)
        {