2009-06-25 Robert Millan * kern/dl.c (Elf_Word, Elf_Addr, Elf_Ehdr, Elf_Shdr, Elf_Sym): Remove typedefs. (ELF_ST_BIND, ELF_ST_TYPE): Remove macros. * include/grub/elf.h (Elf_Word, Elf_Addr, Elf_Ehdr, Elf_Shdr) (Elf_Sym, ELF_ST_BIND, ELF_ST_TYPE): New macros. * efiemu/loadcore64.c: Include `'. (Elf_Word, Elf_Ehdr, Elf_Shdr, Elf_Sym, ELF_ST_BIND) (ELF_ST_TYPE): Undefine macros for native word length so that they can be redefined afterwards. * efiemu/loadcore32.c: Likewise. * include/grub/dl.h: Include `'. (struct grub_dl): Add `symtab' member. * kern/dl.c (grub_dl_resolve_symbols): Copy symbol table to `mod->symtab', and use the copied structure for further writes rather than the original. * kern/powerpc/dl.c (grub_arch_dl_relocate_symbols): Initialize `symtab' using `mod->symtab'. * kern/sparc64/dl.c: Likewise. * kern/i386/dl.c: Likewise. * kern/x86_64/dl.c: Likewise. Index: kern/powerpc/dl.c =================================================================== --- kern/powerpc/dl.c (revision 2358) +++ kern/powerpc/dl.c (working copy) @@ -58,7 +58,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t if (i == e->e_shnum) return grub_error (GRUB_ERR_BAD_MODULE, "no symtab found"); - symtab = (Elf32_Sym *) ((char *) e + s->sh_offset); + symtab = mod->symtab; entsize = s->sh_entsize; for (i = 0, s = (Elf32_Shdr *) ((char *) e + e->e_shoff); Index: kern/dl.c =================================================================== --- kern/dl.c (revision 2358) +++ kern/dl.c (working copy) @@ -29,30 +29,6 @@ #include #include -#if GRUB_CPU_SIZEOF_VOID_P == 4 - -typedef Elf32_Word Elf_Word; -typedef Elf32_Addr Elf_Addr; -typedef Elf32_Ehdr Elf_Ehdr; -typedef Elf32_Shdr Elf_Shdr; -typedef Elf32_Sym Elf_Sym; - -# define ELF_ST_BIND(val) ELF32_ST_BIND (val) -# define ELF_ST_TYPE(val) ELF32_ST_TYPE (val) - -#elif GRUB_CPU_SIZEOF_VOID_P == 8 - -typedef Elf64_Word Elf_Word; -typedef Elf64_Addr Elf_Addr; -typedef Elf64_Ehdr Elf_Ehdr; -typedef Elf64_Shdr Elf_Shdr; -typedef Elf64_Sym Elf_Sym; - -# define ELF_ST_BIND(val) ELF64_ST_BIND (val) -# define ELF_ST_TYPE(val) ELF64_ST_TYPE (val) - -#endif - struct grub_dl_list @@ -333,9 +309,11 @@ grub_dl_resolve_symbols (grub_dl_t mod, if (i == e->e_shnum) return grub_error (GRUB_ERR_BAD_MODULE, "no symbol table"); - sym = (Elf_Sym *) ((char *) e + s->sh_offset); size = s->sh_size; entsize = s->sh_entsize; + mod->symtab = grub_malloc (size); + memcpy (mod->symtab, (char *) e + s->sh_offset, size); + sym = mod->symtab; s = (Elf_Shdr *) ((char *) e + e->e_shoff + e->e_shentsize * s->sh_link); str = (char *) e + s->sh_offset; @@ -695,6 +673,7 @@ grub_dl_unload (grub_dl_t mod) } grub_free (mod->name); + grub_free (mod->symtab); grub_free (mod); return 1; } Index: kern/sparc64/dl.c =================================================================== --- kern/sparc64/dl.c (revision 2358) +++ kern/sparc64/dl.c (working copy) @@ -58,7 +58,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t if (i == e->e_shnum) return grub_error (GRUB_ERR_BAD_MODULE, "no symtab found"); - symtab = (Elf64_Sym *) ((char *) e + s->sh_offset); + symtab = mod->symtab; entsize = s->sh_entsize; for (i = 0, s = (Elf64_Shdr *) ((char *) e + e->e_shoff); Index: kern/i386/dl.c =================================================================== --- kern/i386/dl.c (revision 2358) +++ kern/i386/dl.c (working copy) @@ -57,7 +57,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t if (i == e->e_shnum) return grub_error (GRUB_ERR_BAD_MODULE, "no symtab found"); - symtab = (Elf32_Sym *) ((char *) e + s->sh_offset); + symtab = mod->symtab; entsize = s->sh_entsize; for (i = 0, s = (Elf32_Shdr *) ((char *) e + e->e_shoff); Index: kern/x86_64/dl.c =================================================================== --- kern/x86_64/dl.c (revision 2358) +++ kern/x86_64/dl.c (working copy) @@ -57,7 +57,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t if (i == e->e_shnum) return grub_error (GRUB_ERR_BAD_MODULE, "no symtab found"); - symtab = (Elf64_Sym *) ((char *) e + s->sh_offset); + symtab = mod->symtab; entsize = s->sh_entsize; for (i = 0, s = (Elf64_Shdr *) ((char *) e + e->e_shoff); Index: efiemu/loadcore64.c =================================================================== --- efiemu/loadcore64.c (revision 2358) +++ efiemu/loadcore64.c (working copy) @@ -18,6 +18,15 @@ */ #define SUFFIX(x) x ## 64 + +#include +#undef Elf_Ehdr +#undef Elf_Shdr +#undef Elf_Sym +#undef Elf_Word +#undef ELF_ST_TYPE +#undef ELF_ST_BIND + #define Elf_Ehdr Elf64_Ehdr #define Elf_Shdr Elf64_Shdr #define Elf_Sym Elf64_Sym Index: efiemu/loadcore32.c =================================================================== --- efiemu/loadcore32.c (revision 2358) +++ efiemu/loadcore32.c (working copy) @@ -18,10 +18,20 @@ */ #define SUFFIX(x) x ## 32 + +#include +#undef Elf_Ehdr +#undef Elf_Shdr +#undef Elf_Sym +#undef Elf_Word +#undef ELF_ST_TYPE +#undef ELF_ST_BIND + #define Elf_Ehdr Elf32_Ehdr #define Elf_Shdr Elf32_Shdr #define Elf_Sym Elf32_Sym #define Elf_Word Elf32_Word #define ELF_ST_TYPE ELF32_ST_TYPE #define ELF_ST_BIND ELF32_ST_BIND + #include "loadcore.c" Index: include/grub/elf.h =================================================================== --- include/grub/elf.h (revision 2358) +++ include/grub/elf.h (working copy) @@ -2330,4 +2330,28 @@ typedef Elf32_Addr Elf32_Conflict; #define R_X86_64_NUM 24 +#if GRUB_CPU_SIZEOF_VOID_P == 4 + +#define Elf_Word Elf32_Word +#define Elf_Addr Elf32_Addr +#define Elf_Ehdr Elf32_Ehdr +#define Elf_Shdr Elf32_Shdr +#define Elf_Sym Elf32_Sym + +# define ELF_ST_BIND(val) ELF32_ST_BIND (val) +# define ELF_ST_TYPE(val) ELF32_ST_TYPE (val) + +#elif GRUB_CPU_SIZEOF_VOID_P == 8 + +#define Elf_Word Elf64_Word +#define Elf_Addr Elf64_Addr +#define Elf_Ehdr Elf64_Ehdr +#define Elf_Shdr Elf64_Shdr +#define Elf_Sym Elf64_Sym + +# define ELF_ST_BIND(val) ELF64_ST_BIND (val) +# define ELF_ST_TYPE(val) ELF64_ST_TYPE (val) + +#endif + #endif /* ! GRUB_ELF_H */ Index: include/grub/dl.h =================================================================== --- include/grub/dl.h (revision 2358) +++ include/grub/dl.h (working copy) @@ -23,6 +23,7 @@ #include #include #include +#include #define GRUB_MOD_INIT(name) \ static void grub_mod_init (grub_dl_t mod __attribute__ ((unused))) __attribute__ ((used)); \ @@ -78,6 +79,7 @@ struct grub_dl int ref_count; grub_dl_dep_t dep; grub_dl_segment_t segment; + Elf_Sym *symtab; void (*init) (struct grub_dl *mod); void (*fini) (void); };