diff options
author | Roland McGrath <roland@redhat.com> | 2010-11-11 09:52:58 -0800 |
---|---|---|
committer | Roland McGrath <roland@redhat.com> | 2010-11-11 09:52:58 -0800 |
commit | 58af2001b92a8a8ee21a81b2845449ae8d038b7c (patch) | |
tree | 0f14986c936ae9d638262d1f0025229a06d723dd | |
parent | 77221de070e8978c312d3e6b2c66a28dca4c37bc (diff) | |
download | elfutils-58af2001b92a8a8ee21a81b2845449ae8d038b7c.tar.gz |
findtextrel: Optimize last change.
-rw-r--r-- | src/findtextrel.c | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/src/findtextrel.c b/src/findtextrel.c index 46b86eb7..986c406e 100644 --- a/src/findtextrel.c +++ b/src/findtextrel.c @@ -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; } } |