From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1WIjHk-0002dB-3H for mharc-grub-devel@gnu.org; Wed, 26 Feb 2014 13:32:48 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43142) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WIjHX-0002GP-E8 for grub-devel@gnu.org; Wed, 26 Feb 2014 13:32:44 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WIjHO-0001Jv-GV for grub-devel@gnu.org; Wed, 26 Feb 2014 13:32:35 -0500 Received: from e39.co.us.ibm.com ([32.97.110.160]:53727) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WIjHO-0001Jo-9U for grub-devel@gnu.org; Wed, 26 Feb 2014 13:32:26 -0500 Received: from /spool/local by e39.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 26 Feb 2014 11:32:25 -0700 Received: from d03dlp02.boulder.ibm.com (9.17.202.178) by e39.co.us.ibm.com (192.168.1.139) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 26 Feb 2014 11:32:22 -0700 Received: from b03cxnp07029.gho.boulder.ibm.com (b03cxnp07029.gho.boulder.ibm.com [9.17.130.16]) by d03dlp02.boulder.ibm.com (Postfix) with ESMTP id AD3613E4003E for ; Wed, 26 Feb 2014 11:32:20 -0700 (MST) Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by b03cxnp07029.gho.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id s1QGTdEM10355126 for ; Wed, 26 Feb 2014 17:29:39 +0100 Received: from d03av02.boulder.ibm.com (localhost [127.0.0.1]) by d03av02.boulder.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s1QIWKm0018379 for ; Wed, 26 Feb 2014 11:32:20 -0700 Received: from ram.oc3035372033.ibm.com.com (sig-9-65-83-23.mts.ibm.com [9.65.83.23]) by d03av02.boulder.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id s1QIVZLh014663; Wed, 26 Feb 2014 11:32:18 -0700 From: Ram Pai To: grub-devel@gnu.org Subject: [RFC PATCH 18/23] .TOC. symbol is special in ppc64le Date: Wed, 26 Feb 2014 10:31:17 -0800 Message-Id: <1393439482-20341-19-git-send-email-linuxram@us.ibm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1393439482-20341-1-git-send-email-linuxram@us.ibm.com> References: <1393439482-20341-1-git-send-email-linuxram@us.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 14022618-9332-0000-0000-0000033B94D9 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 32.97.110.160 Cc: tonyb@au1.ibm.com, anton@au1.ibm.com, linuxram@us.ibm.com, tlfalcon@linux.vnet.ibm.com, tbberry@us.ibm.com X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 26 Feb 2014 18:32:44 -0000 .TOC. symbol is special in ppc64le . It maps to the address of the .toc section. Signed-off-by: Ram Pai --- grub-core/kern/dl.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c index de2d0ed..ce2ff38 100644 --- a/grub-core/kern/dl.c +++ b/grub-core/kern/dl.c @@ -343,6 +343,26 @@ grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e) return GRUB_ERR_NONE; } +#ifdef __powerpc64le__ +static int +grub_dl_find_section_index (Elf_Ehdr *e, const char *name) +{ + 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, name) == 0) + return i; + return -1; +} +#endif + static grub_err_t grub_dl_resolve_symbols (grub_dl_t mod, Elf_Ehdr *e) { @@ -392,7 +412,19 @@ grub_dl_resolve_symbols (grub_dl_t mod, Elf_Ehdr *e) /* Resolve a global symbol. */ if (sym->st_name != 0 && sym->st_shndx == 0) { - grub_symbol_t nsym = grub_dl_resolve_symbol (name); + grub_symbol_t nsym; + +#ifdef __powerpc64le__ + if (grub_strcmp(name, ".TOC.") == 0) { + int j = grub_dl_find_section_index (e, ".toc"); + if (j < 0) + return grub_error (GRUB_ERR_BAD_MODULE, + N_("section '.toc' not found"), name); + sym->st_value = (Elf_Addr) grub_dl_get_section_addr (mod, j); + break; + } +#endif + nsym = grub_dl_resolve_symbol (name); if (! nsym) return grub_error (GRUB_ERR_BAD_MODULE, N_("symbol `%s' not found"), name); -- 1.8.5.3