Go ahead

Le mer. 3 févr. 2016 18:09, Andrei Borzenkov <arvidj...@gmail.com> a écrit :

> all_video module does not have any code or data and exists solely for
> .moddeps section to pull in dependencies. This makes all symbols unneeded.
>
> While in current binutils (last released version as of this commit is 2.26)
> ``strip --strip-unneeded'' unintentionally adds section symbols for each
> existing section, this behavior was considered a bug and changed in commit
> 14f2c699ddca1e2f706342dffc59a6c7e23e844c to completely strip symbol table
> in this case.
>
> Older binutils (verified with 2.17) and some other toolchains (at least
> elftoolchain r3223M), both used in FreeBSD, remove symbol table in
> all_video
> as well.
>
> Relax run-time check and do not return error for modules without symbol
> table.
> Add additional checks to module verifier to make sure such modules
>
> a) have non-empty .moddeps section. Without either externally visible
> symbols
> or .moddeps modules are completely useless and should not be built.
>
> b) do not have any relocations.
>
> Closes: 46986
>
> v2: add run-time check for empty symbol table if relocations are present as
>     suggested by Vladimir.
>
> ---
>  grub-core/kern/dl.c           |  8 +++++++-
>  util/grub-module-verifierXX.c | 19 ++++++++++++++++++-
>  2 files changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c
> index 59a6ef4..e394cd9 100644
> --- a/grub-core/kern/dl.c
> +++ b/grub-core/kern/dl.c
> @@ -333,8 +333,11 @@ grub_dl_resolve_symbols (grub_dl_t mod, Elf_Ehdr *e)
>      if (s->sh_type == SHT_SYMTAB)
>        break;
>
> +  /* Module without symbol table may still be used to pull in
> dependencies.
> +     We verify at build time that such modules do not contain any
> relocations
> +     that may reference symbol table. */
>    if (i == e->e_shnum)
> -    return grub_error (GRUB_ERR_BAD_MODULE, N_("no symbol table"));
> +    return GRUB_ERR_NONE;
>
>  #ifdef GRUB_MODULES_MACHINE_READONLY
>    mod->symtab = grub_malloc (s->sh_size);
> @@ -576,6 +579,9 @@ grub_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
>
>         if (seg)
>           {
> +           if (!mod->symtab)
> +             return grub_error (GRUB_ERR_BAD_MODULE, "relocation without
> symbol table");
> +
>             err = grub_arch_dl_relocate_symbols (mod, ehdr, s, seg);
>             if (err)
>               return err;
> diff --git a/util/grub-module-verifierXX.c b/util/grub-module-verifierXX.c
> index f612d51..f8c15b0 100644
> --- a/util/grub-module-verifierXX.c
> +++ b/util/grub-module-verifierXX.c
> @@ -176,7 +176,7 @@ get_symtab (const struct grub_module_verifier_arch
> *arch, Elf_Ehdr *e, Elf_Word
>        break;
>
>    if (i == grub_target_to_host16 (e->e_shnum))
> -    grub_util_error ("no symbol table");
> +    return NULL;
>
>    sym = (Elf_Sym *) ((char *) e + grub_target_to_host (s->sh_offset));
>    *size = grub_target_to_host (s->sh_size);
> @@ -191,7 +191,21 @@ check_symbols (const struct grub_module_verifier_arch
> *arch, Elf_Ehdr *e)
>    Elf_Word size, entsize;
>    unsigned i;
>
> +  /* Module without symbol table and without .moddeps section is useless
> +     at boot time, so catch it early to prevent build errors */
>    sym = get_symtab (arch, e, &size, &entsize);
> +  if (!sym)
> +    {
> +      Elf_Shdr *s = find_section (arch, e, ".moddeps");
> +
> +      if (!s)
> +       grub_util_error ("no symbol table and no .moddeps section");
> +
> +      if (!s->sh_size)
> +       grub_util_error ("no symbol table and empty .moddeps section");
> +
> +      return;
> +    }
>
>    for (i = 0;
>         i < size / entsize;
> @@ -243,6 +257,8 @@ section_check_relocations (const struct
> grub_module_verifier_arch *arch, void *e
>    Elf_Word symtabsize, symtabentsize;
>
>    symtab = get_symtab (arch, ehdr, &symtabsize, &symtabentsize);
> +  if (!symtab)
> +    grub_util_error ("relocation without symbol table");
>
>    for (rel = (Elf_Rel *) ((char *) ehdr + grub_target_to_host
> (s->sh_offset)),
>          max = (Elf_Rel *) ((char *) rel + grub_target_to_host
> (s->sh_size));
> @@ -272,6 +288,7 @@ section_check_relocations (const struct
> grub_module_verifier_arch *arch, void *e
>           break;
>        if (arch->short_relocations[i] == -1)
>         grub_util_error ("unsupported relocation 0x%x", type);
> +
>        sym = (Elf_Sym *) ((char *) symtab + symtabentsize * ELF_R_SYM
> (grub_target_to_host (rel->r_info)));
>
>        if (is_symbol_local (sym))
> --
> tg: (7290bb5..) bug/46986 (depends on: master)
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to