From: Danny Smith Date: Tue, 14 Oct 2003 06:26:31 +0000 (+0000) Subject: * pe-dll.c (pe_implied_import_dll): Also scan .rdata sections X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=661a32f7da231ce858ca603604945735c531756f;p=binutils-gdb.git * pe-dll.c (pe_implied_import_dll): Also scan .rdata sections to identify data symbols. --- diff --git a/ld/ChangeLog b/ld/ChangeLog index 0f1ce221722..09f4cd796f6 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,8 @@ +2003-10-14 Danny Smith + + * pe-dll.c (pe_implied_import_dll): Also scan .rdata sections + to identify data symbols. + 2003-10-13 Richard Sandiford * emulparams/elf32bmipn32-defs.sh (INITIAL_READONLY_SECTIONS): Move diff --git a/ld/pe-dll.c b/ld/pe-dll.c index cc69474d203..968249474ea 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -2441,9 +2441,11 @@ pe_implied_import_dll (const char *filename) /* Initialization with start > end guarantees that is_data will not be set by mistake, and avoids compiler warning. */ unsigned long data_start = 1; - unsigned long data_end = 0; - unsigned long bss_start = 1; - unsigned long bss_end = 0; + unsigned long data_end = 0; + unsigned long rdata_start = 1; + unsigned long rdata_end = 0; + unsigned long bss_start = 1; + unsigned long bss_end = 0; /* No, I can't use bfd here. kernel32.dll puts its export table in the middle of the .rdata section. */ @@ -2516,6 +2518,15 @@ pe_implied_import_dll (const char *filename) data_start = vaddr; data_end = vaddr + vsize; + if (pe_dll_extra_pe_debug) + printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n", + __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags); + } + else if (strcmp(sec_name,".rdata") == 0) + { + rdata_start = vaddr; + rdata_end = vaddr + vsize; + if (pe_dll_extra_pe_debug) printf ("%s %s: 0x%08lx-0x%08lx (0x%08lx)\n", __FUNCTION__, sec_name, vaddr, vaddr + vsize, flags); @@ -2573,9 +2584,11 @@ pe_implied_import_dll (const char *filename) exported in buggy auto-import releases. */ if (strncmp (erva + name_rva, "_nm_", 4) != 0) { - /* is_data is true if the address is in the data or bss segment. */ + /* is_data is true if the address is in the data, rdata or bss + segment. */ is_data = (func_rva >= data_start && func_rva < data_end) + || (func_rva >= rdata_start && func_rva < rdata_end) || (func_rva >= bss_start && func_rva < bss_end); imp = def_file_add_import (pe_def_file, erva + name_rva,