From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1Iqvck-0004jn-8I for mharc-grub-devel@gnu.org; Sat, 10 Nov 2007 14:04:06 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Iqvci-0004fG-Kb for grub-devel@gnu.org; Sat, 10 Nov 2007 14:04:04 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Iqvci-0004ek-3e for grub-devel@gnu.org; Sat, 10 Nov 2007 14:04:04 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Iqvci-0004eb-0P for grub-devel@gnu.org; Sat, 10 Nov 2007 14:04:04 -0500 Received: from mailout04.sul.t-online.de ([194.25.134.18] helo=mailout04.sul.t-online.com) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Iqvch-0000D8-5y for grub-devel@gnu.org; Sat, 10 Nov 2007 14:04:03 -0500 Received: from fwd30.aul.t-online.de by mailout04.sul.t-online.com with smtp id 1Iqvcg-0004os-00; Sat, 10 Nov 2007 20:04:02 +0100 Received: from [10.3.2.2] (b7Aoo2ZD8hpGO-586MYsFpk17q+DjG1LD62BFpLJVQ3uGhOZ2JE5D0hU-w2COR7wIq@[217.235.218.98]) by fwd30.aul.t-online.de with esmtp id 1Iqvcc-1X0Oe00; Sat, 10 Nov 2007 20:03:58 +0100 Message-ID: <4736009D.3010502@t-online.de> Date: Sat, 10 Nov 2007 20:03:57 +0100 From: Christian Franke User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070802 SeaMonkey/1.1.4 MIME-Version: 1.0 To: grub-devel@gnu.org Content-Type: multipart/mixed; boundary="------------070008090908060905070904" X-ID: b7Aoo2ZD8hpGO-586MYsFpk17q+DjG1LD62BFpLJVQ3uGhOZ2JE5D0hU-w2COR7wIq X-TOI-MSGID: f8a82695-6f48-4488-a922-c6a8bfcacbdb X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 3) Subject: [PATCH] Handle C symbols with leading underscore (HAVE_ASM_USCORE) X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Nov 2007 19:04:04 -0000 This is a multi-part message in MIME format. --------------070008090908060905070904 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit HAVE_ASM_USCORE is checked by configure, but module loader does not work in this case. This patch fixes this by ignoring the difference. It actually works to load modules compiled on Linux by a kernel compiled on Cygwin (with underscores) and vice versa. It also prepares the grub_mod_init/finit search for modules converted from non-ELF format (which do not support the "function" symbol type). A bug in symbol table scan is fixed. Christian 2007-11-10 Christian Franke * genkernsyms.sh.in: Handle HAVE_ASM_USCORE case. * genmk.rb: Handle HAVE_ASM_USCORE case in strip command. Add $EXEEXT to CLEANFILES. * kern/dl.c (grub_dl_resolve_symbol): Handle HAVE_ASM_USCORE case, ignore leading underscore. (grub_dl_register_symbol): Likewise. (grub_dl_resolve_symbols): Likewise. Add check for grub_mod_init/fini for symbols without type. (grub_dl_resolve_dependencies): Add check for trailing nullbytes in symbol table. This fixes an infinite loop if stab is zero filled. --------------070008090908060905070904 Content-Type: text/x-patch; name="grub2-asm_uscore.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="grub2-asm_uscore.patch" diff -rup grub2.orig/genkernsyms.sh.in grub2/genkernsyms.sh.in --- grub2.orig/genkernsyms.sh.in 2006-07-12 22:42:52.000000000 +0200 +++ grub2/genkernsyms.sh.in 2007-10-06 12:59:29.000000000 +0200 @@ -16,9 +16,12 @@ srcdir=@srcdir@ CC="@CC@" +u= +grep "^#define HAVE_ASM_USCORE" config.h >/dev/null 2>&1 && u="_" + $CC -DGRUB_SYMBOL_GENERATOR=1 -E -I. -Iinclude -I$srcdir/include $* \ | grep -v '^#' \ | sed -n \ - -e '/EXPORT_FUNC *([a-zA-Z0-9_]*)/{s/.*EXPORT_FUNC *(\([a-zA-Z0-9_]*\)).*/\1 kernel/;p;}' \ - -e '/EXPORT_VAR *([a-zA-Z0-9_]*)/{s/.*EXPORT_VAR *(\([a-zA-Z0-9_]*\)).*/\1 kernel/;p;}' \ + -e '/EXPORT_FUNC *([a-zA-Z0-9_]*)/{s/.*EXPORT_FUNC *(\([a-zA-Z0-9_]*\)).*/'"$u"'\1 kernel/;p;}' \ + -e '/EXPORT_VAR *([a-zA-Z0-9_]*)/{s/.*EXPORT_VAR *(\([a-zA-Z0-9_]*\)).*/'"$u"'\1 kernel/;p;}' \ | sort -u diff -rup grub2.orig/genmk.rb grub2/genmk.rb --- grub2.orig/genmk.rb 2007-10-20 22:49:38.968750000 +0200 +++ grub2/genmk.rb 2007-11-10 19:37:17.562500000 +0100 @@ -115,7 +115,7 @@ UNDSYMFILES += #{undsym} #{@name}: #{pre_obj} #{mod_obj} -rm -f $@ $(TARGET_CC) $(#{prefix}_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ $^ - $(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@ + $(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -K _grub_mod_init -K _grub_mod_fini -R .note -R .comment $@ #{pre_obj}: $(#{prefix}_DEPENDENCIES) #{objs_str} -rm -f $@ @@ -187,7 +187,7 @@ class Utility deps = objs.collect {|obj| obj.suffix('d')} deps_str = deps.join(' '); - "CLEANFILES += #{@name} #{objs_str} + "CLEANFILES += #{@name}$(EXEEXT) #{objs_str} MOSTLYCLEANFILES += #{deps_str} #{@name}: $(#{prefix}_DEPENDENCIES) #{objs_str} diff -rup grub2.orig/kern/dl.c grub2/kern/dl.c --- grub2.orig/kern/dl.c 2007-07-22 01:32:26.000000000 +0200 +++ grub2/kern/dl.c 2007-11-10 19:44:34.140625000 +0100 @@ -156,6 +156,9 @@ grub_dl_resolve_symbol (const char *name { grub_symbol_t sym; + if (*name == '_') + name++; + for (sym = grub_symtab[grub_symbol_hash (name)]; sym; sym = sym->next) if (grub_strcmp (sym->name, name) == 0) return sym->addr; @@ -169,6 +172,11 @@ grub_dl_register_symbol (const char *nam { grub_symbol_t sym; unsigned k; + + /* Ignore leading underscore used for C symbols. + Done at runtime to allow loading modules compiled on other OS. */ + if (*name == '_') + name++; sym = (grub_symbol_t) grub_malloc (sizeof (*sym)); if (! sym) @@ -347,6 +355,7 @@ grub_dl_resolve_symbols (grub_dl_t mod, unsigned char type = ELF_ST_TYPE (sym->st_info); unsigned char bind = ELF_ST_BIND (sym->st_info); const char *name = str + sym->st_name; + int check_mod_func = 0; switch (type) { @@ -359,6 +368,12 @@ grub_dl_resolve_symbols (grub_dl_t mod, return grub_error (GRUB_ERR_BAD_MODULE, "the symbol `%s' not found", name); } + else if (sym->st_name != 0 && bind == STB_LOCAL) + { /* Static functions have no type if initial format was not ELF. */ + sym->st_value += (Elf_Addr) grub_dl_get_section_addr (mod, + sym->st_shndx); + check_mod_func = 1; + } else sym->st_value = 0; break; @@ -374,14 +389,11 @@ grub_dl_resolve_symbols (grub_dl_t mod, case STT_FUNC: sym->st_value += (Elf_Addr) grub_dl_get_section_addr (mod, sym->st_shndx); - if (bind != STB_LOCAL) + if (bind == STB_LOCAL) + check_mod_func = 1; + else if (grub_dl_register_symbol (name, (void *) sym->st_value, mod)) return grub_errno; - - if (grub_strcmp (name, "grub_mod_init") == 0) - mod->init = (void (*) (grub_dl_t)) sym->st_value; - else if (grub_strcmp (name, "grub_mod_fini") == 0) - mod->fini = (void (*) (void)) sym->st_value; break; case STT_SECTION: @@ -397,6 +409,15 @@ grub_dl_resolve_symbols (grub_dl_t mod, return grub_error (GRUB_ERR_BAD_MODULE, "unknown symbol type `%d'", (int) type); } + if (check_mod_func) + { + if (*name == '_') + name++; + if (grub_strcmp (name, "grub_mod_init") == 0) + mod->init = (void (*) (grub_dl_t)) sym->st_value; + else if (grub_strcmp (name, "grub_mod_fini") == 0) + mod->fini = (void (*) (void)) sym->st_value; + } } return GRUB_ERR_NONE; @@ -454,7 +475,7 @@ grub_dl_resolve_dependencies (grub_dl_t const char *name = (char *) e + s->sh_offset; const char *max = name + s->sh_size; - while (name < max) + while (name < max && *name) /* Segment may contain trailing 0. */ { grub_dl_t m; grub_dl_dep_t dep; --------------070008090908060905070904--