]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
findtextrel: Optimize last change.
authorRoland McGrath <roland@redhat.com>
Thu, 11 Nov 2010 17:52:58 +0000 (09:52 -0800)
committerRoland McGrath <roland@redhat.com>
Thu, 11 Nov 2010 17:52:58 +0000 (09:52 -0800)
src/findtextrel.c

index 46b86eb7127a6429a5a8ecae8986b6878b9433be..986c406e56ca74735cd23a68350745989153c7b4 100644 (file)
@@ -264,7 +264,8 @@ process_file (const char *fname, bool more_than_one)
   Elf_Scn *scn = NULL;
   bool seen_dynamic = false;
   bool have_textrel = false;
-  while ((scn = elf_nextscn (elf, scn)) != NULL)
+  while ((scn = elf_nextscn (elf, scn)) != NULL
+        && (!seen_dynamic || symscn == NULL))
     {
       /* Handle the section if it is a symbol table.  */
       GElf_Shdr shdr_mem;
@@ -278,39 +279,40 @@ process_file (const char *fname, bool more_than_one)
          goto err_elf_close;
        }
 
-      if (shdr->sh_type == SHT_DYNAMIC)
+      switch (shdr->sh_type)
        {
-         Elf_Data *data = elf_getdata (scn, NULL);
-
-         for (size_t cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize;
-              ++cnt)
+       case SHT_DYNAMIC:
+         if (!seen_dynamic)
            {
-             GElf_Dyn dynmem;
-             GElf_Dyn *dyn;
+             seen_dynamic = true;
+
+             Elf_Data *data = elf_getdata (scn, NULL);
 
-             dyn = gelf_getdyn (data, cnt, &dynmem);
-             if (dyn == NULL)
+             for (size_t cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize;
+                  ++cnt)
                {
-                 error (0, 0, gettext ("cannot read dynamic section: %s"),
-                        elf_errmsg (-1));
-                 goto err_elf_close;
-               }
+                 GElf_Dyn dynmem;
+                 GElf_Dyn *dyn;
 
-             if (dyn->d_tag == DT_TEXTREL
-                 || (dyn->d_tag == DT_FLAGS
-                     && (dyn->d_un.d_val & DF_TEXTREL) != 0))
-               have_textrel = true;
+                 dyn = gelf_getdyn (data, cnt, &dynmem);
+                 if (dyn == NULL)
+                   {
+                     error (0, 0, gettext ("cannot read dynamic section: %s"),
+                            elf_errmsg (-1));
+                     goto err_elf_close;
+                   }
+
+                 if (dyn->d_tag == DT_TEXTREL
+                     || (dyn->d_tag == DT_FLAGS
+                         && (dyn->d_un.d_val & DF_TEXTREL) != 0))
+                   have_textrel = true;
+               }
            }
+         break;
 
-         seen_dynamic = true;
-         if (symscn != NULL)
-           break;
-       }
-      else if (shdr->sh_type == SHT_SYMTAB)
-       {
+       case SHT_SYMTAB:
          symscn = scn;
-         if (seen_dynamic)
-           break;
+         break;
        }
     }