gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Wed, 17 Feb 2010 11:37:23 +0000 (11:37 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Wed, 17 Feb 2010 11:37:23 +0000 (11:37 +0000)
* solib-svr4.c (enable_break <target_auxv_search>): New variable
addr_bit.  Adjust LOAD_ADDR sign for cross-arch inferiors.

gdb/ChangeLog
gdb/solib-svr4.c

index d62be6a0cf0c93c57dfb55b9177ee17a1eac7cca..21b9d97823d4c5fc3b71f7d3a01bd63c52975908 100644 (file)
@@ -1,3 +1,8 @@
+2010-02-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * solib-svr4.c (enable_break <target_auxv_search>): New variable
+       addr_bit.  Adjust LOAD_ADDR sign for cross-arch inferiors.
+
 2010-02-17  Tristan Gingold  <gingold@adacore.com>
            Petr HluzĂ­n <petr.hluzin@gmail.com>
 
index f8e8e84631823ce9826557c8aea39f5f59557e4f..b3b9e00bde1ceb6df526d94c00b143b7aa0aa8a1 100644 (file)
@@ -1451,7 +1451,32 @@ enable_break (struct svr4_info *info, int from_tty)
          from our so_list, then try using the AT_BASE auxilliary entry.  */
       if (!load_addr_found)
         if (target_auxv_search (&current_target, AT_BASE, &load_addr) > 0)
-          load_addr_found = 1;
+         {
+           int addr_bit = gdbarch_addr_bit (target_gdbarch);
+
+           /* Ensure LOAD_ADDR has proper sign in its possible upper bits so
+              that `+ load_addr' will overflow CORE_ADDR width not creating
+              invalid addresses like 0x101234567 for 32bit inferiors on 64bit
+              GDB.  */
+
+           if (addr_bit < (sizeof (ULONGEST) * HOST_CHAR_BIT))
+             {
+               CORE_ADDR space_size = (ULONGEST) 1 << addr_bit;
+               CORE_ADDR tmp_entry_point = exec_entry_point (tmp_bfd,
+                                                             tmp_bfd_target);
+
+               gdb_assert (load_addr < space_size);
+
+               /* TMP_ENTRY_POINT exceeding SPACE_SIZE would be for prelinked
+                  64bit ld.so with 32bit executable, it should not happen.  */
+
+               if (tmp_entry_point < space_size
+                   && tmp_entry_point + load_addr >= space_size)
+                 load_addr -= space_size;
+             }
+
+           load_addr_found = 1;
+         }
 
       /* Otherwise we find the dynamic linker's base address by examining
         the current pc (which should point at the entry point for the