From: Vladimir Serbinenko Date: Fri, 1 Nov 2013 14:20:14 +0000 (+0100) Subject: * grub-core/kern/dl.c: Unify section-finding algorithm. Saves 30 bytes X-Git-Tag: grub-2.02-beta1~531 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=80e8b13ac4e015c7ef7a789156c711d76b0d6754;p=thirdparty%2Fgrub.git * grub-core/kern/dl.c: Unify section-finding algorithm. Saves 30 bytes on core size. --- diff --git a/ChangeLog b/ChangeLog index 7e0b0af5e..5062f6937 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-11-01 Vladimir Serbinenko + + * grub-core/kern/dl.c: Unify section-finding algorithm. Saves 30 bytes + on core size. + 2013-10-30 Vladimir Serbinenko * grub-core/kern/mm.c (grub_realloc): Don't copy more data than we have. diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c index 6c086adda..ccbd5bac4 100644 --- a/grub-core/kern/dl.c +++ b/grub-core/kern/dl.c @@ -433,16 +433,8 @@ grub_dl_resolve_symbols (grub_dl_t mod, Elf_Ehdr *e) return GRUB_ERR_NONE; } -/* Me, Vladimir Serbinenko, hereby I add this module check as per new - GNU module policy. Note that this license check is informative only. - Modules have to be licensed under GPLv3 or GPLv3+ (optionally - multi-licensed under other licences as well) independently of the - presence of this check and solely by linking (module loading in GRUB - constitutes linking) and GRUB core being licensed under GPLv3+. - Be sure to understand your license obligations. -*/ -static grub_err_t -grub_dl_check_license (Elf_Ehdr *e) +static Elf_Shdr * +grub_dl_find_section (Elf_Ehdr *e, const char *name) { Elf_Shdr *s; const char *str; @@ -454,14 +446,27 @@ grub_dl_check_license (Elf_Ehdr *e) for (i = 0, s = (Elf_Shdr *) ((char *) e + e->e_shoff); i < e->e_shnum; i++, s = (Elf_Shdr *) ((char *) s + e->e_shentsize)) - if (grub_strcmp (str + s->sh_name, ".module_license") == 0) - { - if (grub_strcmp ((char *) e + s->sh_offset, "LICENSE=GPLv3") == 0 - || grub_strcmp ((char *) e + s->sh_offset, "LICENSE=GPLv3+") == 0 - || grub_strcmp ((char *) e + s->sh_offset, "LICENSE=GPLv2+") == 0) - return GRUB_ERR_NONE; - } + if (grub_strcmp (str + s->sh_name, name) == 0) + return s; + return NULL; +} +/* Me, Vladimir Serbinenko, hereby I add this module check as per new + GNU module policy. Note that this license check is informative only. + Modules have to be licensed under GPLv3 or GPLv3+ (optionally + multi-licensed under other licences as well) independently of the + presence of this check and solely by linking (module loading in GRUB + constitutes linking) and GRUB core being licensed under GPLv3+. + Be sure to understand your license obligations. +*/ +static grub_err_t +grub_dl_check_license (Elf_Ehdr *e) +{ + Elf_Shdr *s = grub_dl_find_section (e, ".module_license"); + if (s && (grub_strcmp ((char *) e + s->sh_offset, "LICENSE=GPLv3") == 0 + || grub_strcmp ((char *) e + s->sh_offset, "LICENSE=GPLv3+") == 0 + || grub_strcmp ((char *) e + s->sh_offset, "LICENSE=GPLv2+") == 0)) + return GRUB_ERR_NONE; return grub_error (GRUB_ERR_BAD_MODULE, "incompatible license"); } @@ -469,25 +474,14 @@ static grub_err_t grub_dl_resolve_name (grub_dl_t mod, Elf_Ehdr *e) { Elf_Shdr *s; - const char *str; - unsigned i; - s = (Elf_Shdr *) ((char *) e + e->e_shoff + e->e_shstrndx * e->e_shentsize); - str = (char *) e + s->sh_offset; - - for (i = 0, s = (Elf_Shdr *) ((char *) e + e->e_shoff); - i < e->e_shnum; - i++, s = (Elf_Shdr *) ((char *) s + e->e_shentsize)) - if (grub_strcmp (str + s->sh_name, ".modname") == 0) - { - mod->name = grub_strdup ((char *) e + s->sh_offset); - if (! mod->name) - return grub_errno; - break; - } - - if (i == e->e_shnum) + s = grub_dl_find_section (e, ".modname"); + if (!s) return grub_error (GRUB_ERR_BAD_MODULE, "no module name found"); + + mod->name = grub_strdup ((char *) e + s->sh_offset); + if (! mod->name) + return grub_errno; return GRUB_ERR_NONE; } @@ -496,42 +490,36 @@ static grub_err_t grub_dl_resolve_dependencies (grub_dl_t mod, Elf_Ehdr *e) { Elf_Shdr *s; - const char *str; - unsigned i; - s = (Elf_Shdr *) ((char *) e + e->e_shoff + e->e_shstrndx * e->e_shentsize); - str = (char *) e + s->sh_offset; + s = grub_dl_find_section (e, ".moddeps"); - for (i = 0, s = (Elf_Shdr *) ((char *) e + e->e_shoff); - i < e->e_shnum; - i++, s = (Elf_Shdr *) ((char *) s + e->e_shentsize)) - if (grub_strcmp (str + s->sh_name, ".moddeps") == 0) - { - const char *name = (char *) e + s->sh_offset; - const char *max = name + s->sh_size; + if (!s) + return GRUB_ERR_NONE; - while ((name < max) && (*name)) - { - grub_dl_t m; - grub_dl_dep_t dep; + const char *name = (char *) e + s->sh_offset; + const char *max = name + s->sh_size; - m = grub_dl_load (name); - if (! m) - return grub_errno; + while ((name < max) && (*name)) + { + grub_dl_t m; + grub_dl_dep_t dep; - grub_dl_ref (m); + m = grub_dl_load (name); + if (! m) + return grub_errno; - dep = (grub_dl_dep_t) grub_malloc (sizeof (*dep)); - if (! dep) - return grub_errno; + grub_dl_ref (m); - dep->mod = m; - dep->next = mod->dep; - mod->dep = dep; + dep = (grub_dl_dep_t) grub_malloc (sizeof (*dep)); + if (! dep) + return grub_errno; - name += grub_strlen (name) + 1; - } - } + dep->mod = m; + dep->next = mod->dep; + mod->dep = dep; + + name += grub_strlen (name) + 1; + } return GRUB_ERR_NONE; }