Since r_offset in dynamic relocation isn't section relative, we can't
check it like relocations in relocatable objets.  This fixes:

https://bugzilla.redhat.com/show_bug.cgi?id=1205789

        * elflint.c (check_one_reloc): Skip dynamic relocations.
---
 src/elflint.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/elflint.c b/src/elflint.c
index a6f9b68..d881419 100644
--- a/src/elflint.c
+++ b/src/elflint.c
@@ -1392,12 +1392,20 @@ section [%2d] '%s': relocation %zu: only symbol 
'_GLOBAL_OFFSET_TABLE_' can be u
   else if (!known_broken)
     {
       if (destshdr != NULL
-         && GELF_R_TYPE (r_info) != 0
-         && (r_offset - (ehdr->e_type == ET_REL ? 0
-                         : destshdr->sh_addr)) >= destshdr->sh_size)
-       ERROR (gettext ("\
-section [%2d] '%s': relocation %zu: offset out of bounds\n"),
-              idx, section_name (ebl, idx), cnt);
+         && GELF_R_TYPE (r_info) != 0)
+       {
+         if (ehdr->e_type == ET_REL)
+           {
+             if (r_offset >= destshdr->sh_size)
+               ERROR (gettext ("\
+                               section [%2d] '%s': relocation %zu: offset out 
of bounds\n"),
+                      idx, section_name (ebl, idx), cnt);
+           }
+         else
+           {
+             // XXX TODO Check .rel.xxx section addresses.
+           }
+       }
     }
 
   GElf_Sym sym_mem;
-- 
2.1.0

Reply via email to