gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Sun, 17 Apr 2011 19:17:10 +0000 (19:17 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Sun, 17 Apr 2011 19:17:10 +0000 (19:17 +0000)
Fix libraries displacement if they change whether they were prelinked.
* solib-svr4.c (LM_ADDR_CHECK): Set L_ADDR even if the DYNAMIC pointer
does not match.  Comment why.

gdb/testsuite/
* gdb.base/break-interp-lib.c (v, vptr): New variables.
* gdb.base/break-interp.exp (test_attach): New comment.

gdb/ChangeLog
gdb/solib-svr4.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/break-interp-lib.c
gdb/testsuite/gdb.base/break-interp.exp

index 9a862b129c5b9d6e545c94c55888881ca06c106f..2be27b53c42a19febd0c776fa64c46c66eda070c 100644 (file)
@@ -1,3 +1,9 @@
+2011-04-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix libraries displacement if they change whether they were prelinked.
+       * solib-svr4.c (LM_ADDR_CHECK): Set L_ADDR even if the DYNAMIC pointer
+       does not match.  Comment why.
+
 2011-04-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * corelow.c: Include wrapper.h.
index 78c6b1c3ee1493049c7806dbca873e3cc9c12d79..b632dd0de33c68e50a0a427c813080672fe9b055 100644 (file)
@@ -237,11 +237,11 @@ LM_ADDR_CHECK (struct so_list *so, bfd *abfd)
 
             Even on PPC it must be zero-aligned at least for MINPAGESIZE.  */
 
+         l_addr = l_dynaddr - dynaddr;
+
          if ((l_addr & (minpagesize - 1)) == 0
              && (l_addr & align) == ((l_dynaddr - dynaddr) & align))
            {
-             l_addr = l_dynaddr - dynaddr;
-
              if (info_verbose)
                printf_unfiltered (_("Using PIC (Position Independent Code) "
                                     "prelink displacement %s for \"%s\".\n"),
@@ -249,9 +249,20 @@ LM_ADDR_CHECK (struct so_list *so, bfd *abfd)
                                   so->so_name);
            }
          else
-           warning (_(".dynamic section for \"%s\" "
-                      "is not at the expected address "
-                      "(wrong library or version mismatch?)"), so->so_name);
+           {
+             /* There is no way to verify the library file matches.  prelink
+                can during prelinking of an unprelinked file (or unprelinking
+                of a prelinked file) shift the DYNAMIC segment by arbitrary
+                offset without any page size alignment.  There is no way to
+                find out the ELF header and/or Program Headers for a limited
+                verification if it they match.  One could do a verification
+                of the DYNAMIC segment.  Still the found address is the best
+                one GDB could find.  */
+
+             warning (_(".dynamic section for \"%s\" "
+                        "is not at the expected address "
+                        "(wrong library or version mismatch?)"), so->so_name);
+           }
        }
 
     set_addr:
index 6a0d0976d5e7f11a422ed8ed5b22fc9d5ef1205c..dc66c842db19adf84502b7c0f9df65559b7ab17e 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * gdb.base/break-interp-lib.c (v, vptr): New variables.
+       * gdb.base/break-interp.exp (test_attach): New comment.
+
 2011-04-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * gdb.threads/gcore-thread.exp ($core0file): New variable.
index 50c5aad8bda4dfde60915de960207c2b32eda352..aea27a6ddba326423ca84986f4b12ae6369df4cf 100644 (file)
 #include <assert.h>
 #include <stdio.h>
 
+/* Force REL->RELA conversion on i386, see "Prelink", March 4, 2004.  */
+volatile int v[2];
+volatile int *vptr = &v[1];
+
 void
 libfunc (const char *action)
 {
index fe79cae55348bd26af9dea219691af3eddce4e42..08a65cd36e9d6aae648d6d87250725a5ac362fd8 100644 (file)
@@ -352,6 +352,14 @@ proc test_attach {file displacement {relink_args ""}} {
            # test simplicity, we merged this test and the test above by not
            # restoring $INTERP after $EXEC prelink.  $INTERP gets restored
            # later below.
+           #
+           # `(wrong library or version mismatch?)' messages are printed for
+           # $binfile_lib on platforms converting REL->RELA relocations by
+           # prelink (such as on i386).  There is no reliable way to verify
+           # the library file matches the running library in such case but
+           # GDB at least attempts to set the right displacement.  We test
+           # `libfunc' is present in the backtrace and therefore the
+           # displacement has been guessed right.
 
            if [prelink$relink $relink_args [file tail $exec]] {
                # /proc/PID/exe cannot be loaded as it is "EXECNAME (deleted)".