From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26058 invoked by alias); 12 Jun 2011 11:57:16 -0000 Received: (qmail 26050 invoked by uid 22791); 12 Jun 2011 11:57:15 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,TW_BJ,T_RP_MATCHES_RCVD,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from smtp-out3.tiscali.nl (HELO smtp-out3.tiscali.nl) (195.241.79.178) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 12 Jun 2011 11:56:56 +0000 Received: from [212.123.169.34] (helo=[192.168.1.101]) by smtp-out3.tiscali.nl with esmtp (Exim) (envelope-from ) id 1QVjHj-0001Ec-2a for gdb-patches@sourceware.org; Sun, 12 Jun 2011 13:56:55 +0200 Subject: [PATCH] win32: Lookup symbols in the EA Table by ordinal From: Paul Bolle To: gdb-patches@sourceware.org Date: Sun, 12 Jun 2011 11:57:00 -0000 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit Message-ID: <1307879815.1831.0.camel@t41.thuisdomein> Mime-Version: 1.0 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-06/txt/msg00149.txt.bz2 Gdb currently looks up the address of a symbol in the Ordinal/Name Pointer Table and Export Address Table as if those tables have the same ordering. That is not always correct. Therefore gdb should look up a symbol's ordinal in the O/NP table and use that ordinal to look up the symbol's address in the EA table. This should fix http://sourceware.org/bugzilla/show_bug.cgi?id=12716 Signed-off-by: Paul Bolle --- gdb/ChangeLog | 6 ++++++ gdb/coff-pe-read.c | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c72fda4..84d6892 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2011-06-12 Paul Bolle + + * coff-pe-read.c (read_pe_exported_syms): Lookup symbols in the Export + Address Table by ordinal. + * coff-pe-read.c (pe_as16): New. + 2011-06-10 Jan Kratochvil * symtab.c (output_partial_symbol_filename): Exchange the filename and diff --git a/gdb/coff-pe-read.c b/gdb/coff-pe-read.c index ca87b72..0483158 100644 --- a/gdb/coff-pe-read.c +++ b/gdb/coff-pe-read.c @@ -150,6 +150,14 @@ read_pe_truncate_name (char *dll_name) } } +static unsigned int +pe_as16 (void *ptr) +{ + unsigned char *b = ptr; + + return b[0] + (b[1] << 8); +} + /* Low-level support functions, direct from the ld module pe-dll.c. */ static unsigned int pe_get16 (bfd *abfd, int where) @@ -309,11 +317,11 @@ read_pe_exported_syms (struct objfile *objfile) bfd_bread (expdata, (bfd_size_type) export_size, dll); erva = expdata - export_rva; + ordbase = pe_as32 (expdata + 16); /* unused */ nexp = pe_as32 (expdata + 24); + exp_funcbase = pe_as32 (expdata + 28); name_rvas = pe_as32 (expdata + 32); ordinals = pe_as32 (expdata + 36); - ordbase = pe_as32 (expdata + 16); - exp_funcbase = pe_as32 (expdata + 28); /* Use internal dll name instead of full pathname. */ dll_name = pe_as32 (expdata + 12) + erva; @@ -339,8 +347,10 @@ read_pe_exported_syms (struct objfile *objfile) /* Pointer to the names vector. */ unsigned long name_rva = pe_as32 (erva + name_rvas + i * 4); + unsigned long ordinal = pe_as16 (erva + ordinals + i * 2); + /* Pointer to the function address vector. */ - unsigned long func_rva = pe_as32 (erva + exp_funcbase + i * 4); + unsigned long func_rva = pe_as32 (erva + exp_funcbase + ordinal * 4); /* Find this symbol's section in our own array. */ int sectix = 0; -- 1.7.5.4