diff options
Diffstat (limited to 'contrib/binutils/bfd/peXXigen.c')
-rw-r--r-- | contrib/binutils/bfd/peXXigen.c | 461 |
1 files changed, 191 insertions, 270 deletions
diff --git a/contrib/binutils/bfd/peXXigen.c b/contrib/binutils/bfd/peXXigen.c index 598aa7cfa03b..71300219d303 100644 --- a/contrib/binutils/bfd/peXXigen.c +++ b/contrib/binutils/bfd/peXXigen.c @@ -1,6 +1,6 @@ /* Support for the generic parts of PE/PEI; the common executable parts. - Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 - Free Software Foundation, Inc. + Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, + 2005, 2006 Free Software Foundation, Inc. Written by Cygnus Solutions. This file is part of BFD, the Binary File Descriptor library. @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ /* Most of this hacked by Steve Chamberlain <sac@cygnus.com>. @@ -88,20 +88,9 @@ the code is in peigen.c. PowerPC NT is said to be dead. If anybody wants to revive the code, you will have to figure out how to handle those issues. */ - -static void add_data_entry - PARAMS ((bfd *, struct internal_extra_pe_aouthdr *, int, char *, bfd_vma)); -static bfd_boolean pe_print_pdata PARAMS ((bfd *, PTR)); -static bfd_boolean pe_print_reloc PARAMS ((bfd *, PTR)); -static bfd_boolean pe_print_idata PARAMS ((bfd *, PTR)); -static bfd_boolean pe_print_edata PARAMS ((bfd *, PTR)); - void -_bfd_XXi_swap_sym_in (abfd, ext1, in1) - bfd *abfd; - PTR ext1; - PTR in1; +_bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1) { SYMENT *ext = (SYMENT *) ext1; struct internal_syment *in = (struct internal_syment *) in1; @@ -138,24 +127,6 @@ _bfd_XXi_swap_sym_in (abfd, ext1, in1) { in->n_value = 0x0; -#if 0 - /* FIXME: This is clearly wrong. The problem seems to be that - undefined C_SECTION symbols appear in the first object of a - MS generated .lib file, and the symbols are not defined - anywhere. */ - in->n_scnum = 1; - - /* I have tried setting the class to 3 and using the following - to set the section number. This will put the address of the - pointer to the string kernel32.dll at addresses 0 and 0x10 - off start of idata section which is not correct. */ -#if 0 - if (strcmp (in->_n._n_name, ".idata$4") == 0) - in->n_scnum = 3; - else - in->n_scnum = 2; -#endif -#else /* Create synthetic empty sections as needed. DJ */ if (in->n_scnum == 0) { @@ -189,16 +160,14 @@ _bfd_XXi_swap_sym_in (abfd, ext1, in1) sec->vma = 0; sec->lma = 0; - sec->_cooked_size = 0; - sec->_raw_size = 0; + sec->size = 0; sec->filepos = 0; sec->rel_filepos = 0; sec->reloc_count = 0; sec->line_filepos = 0; sec->lineno_count = 0; sec->userdata = NULL; - sec->next = (asection *) NULL; - sec->flags = 0; + sec->next = NULL; sec->alignment_power = 2; sec->flags = SEC_HAS_CONTENTS | SEC_ALLOC | SEC_DATA | SEC_LOAD; @@ -207,7 +176,6 @@ _bfd_XXi_swap_sym_in (abfd, ext1, in1) in->n_scnum = unused_section_number; } in->n_sclass = C_STAT; -#endif } #endif @@ -219,10 +187,7 @@ _bfd_XXi_swap_sym_in (abfd, ext1, in1) } unsigned int -_bfd_XXi_swap_sym_out (abfd, inp, extp) - bfd *abfd; - PTR inp; - PTR extp; +_bfd_XXi_swap_sym_out (bfd * abfd, void * inp, void * extp) { struct internal_syment *in = (struct internal_syment *) inp; SYMENT *ext = (SYMENT *) extp; @@ -250,14 +215,13 @@ _bfd_XXi_swap_sym_out (abfd, inp, extp) } void -_bfd_XXi_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1) - bfd *abfd; - PTR ext1; - int type; - int class; - int indx ATTRIBUTE_UNUSED; - int numaux ATTRIBUTE_UNUSED; - PTR in1; +_bfd_XXi_swap_aux_in (bfd * abfd, + void * ext1, + int type, + int class, + int indx ATTRIBUTE_UNUSED, + int numaux ATTRIBUTE_UNUSED, + void * in1) { AUXENT *ext = (AUXENT *) ext1; union internal_auxent *in = (union internal_auxent *) in1; @@ -322,19 +286,19 @@ _bfd_XXi_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1) } unsigned int -_bfd_XXi_swap_aux_out (abfd, inp, type, class, indx, numaux, extp) - bfd *abfd; - PTR inp; - int type; - int class; - int indx ATTRIBUTE_UNUSED; - int numaux ATTRIBUTE_UNUSED; - PTR extp; +_bfd_XXi_swap_aux_out (bfd * abfd, + void * inp, + int type, + int class, + int indx ATTRIBUTE_UNUSED, + int numaux ATTRIBUTE_UNUSED, + void * extp) { union internal_auxent *in = (union internal_auxent *) inp; AUXENT *ext = (AUXENT *) extp; - memset ((PTR) ext, 0, AUXESZ); + memset (ext, 0, AUXESZ); + switch (class) { case C_FILE: @@ -396,10 +360,7 @@ _bfd_XXi_swap_aux_out (abfd, inp, type, class, indx, numaux, extp) } void -_bfd_XXi_swap_lineno_in (abfd, ext1, in1) - bfd *abfd; - PTR ext1; - PTR in1; +_bfd_XXi_swap_lineno_in (bfd * abfd, void * ext1, void * in1) { LINENO *ext = (LINENO *) ext1; struct internal_lineno *in = (struct internal_lineno *) in1; @@ -409,10 +370,7 @@ _bfd_XXi_swap_lineno_in (abfd, ext1, in1) } unsigned int -_bfd_XXi_swap_lineno_out (abfd, inp, outp) - bfd *abfd; - PTR inp; - PTR outp; +_bfd_XXi_swap_lineno_out (bfd * abfd, void * inp, void * outp) { struct internal_lineno *in = (struct internal_lineno *) inp; struct external_lineno *ext = (struct external_lineno *) outp; @@ -423,14 +381,13 @@ _bfd_XXi_swap_lineno_out (abfd, inp, outp) } void -_bfd_XXi_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1) - bfd *abfd; - PTR aouthdr_ext1; - PTR aouthdr_int1; +_bfd_XXi_swap_aouthdr_in (bfd * abfd, + void * aouthdr_ext1, + void * aouthdr_int1) { struct internal_extra_pe_aouthdr *a; - PEAOUTHDR *src = (PEAOUTHDR *) (aouthdr_ext1); - AOUTHDR *aouthdr_ext = (AOUTHDR *) aouthdr_ext1; + PEAOUTHDR * src = (PEAOUTHDR *) (aouthdr_ext1); + AOUTHDR * aouthdr_ext = (AOUTHDR *) aouthdr_ext1; struct internal_aouthdr *aouthdr_int = (struct internal_aouthdr *)aouthdr_int1; aouthdr_int->magic = H_GET_16 (abfd, aouthdr_ext->magic); @@ -442,7 +399,7 @@ _bfd_XXi_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1) aouthdr_int->text_start = GET_AOUTHDR_TEXT_START (abfd, aouthdr_ext->text_start); #ifndef COFF_WITH_pep - /* PE32+ does not have data_start member! */ + /* PE32+ does not have data_start member! */ aouthdr_int->data_start = GET_AOUTHDR_DATA_START (abfd, aouthdr_ext->data_start); #endif @@ -511,7 +468,7 @@ _bfd_XXi_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1) } #ifndef COFF_WITH_pep - /* PE32+ does not have data_start member! */ + /* PE32+ does not have data_start member! */ if (aouthdr_int->dsize) { aouthdr_int->data_start += a->ImageBase; @@ -532,12 +489,11 @@ _bfd_XXi_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1) /* A support function for below. */ static void -add_data_entry (abfd, aout, idx, name, base) - bfd *abfd; - struct internal_extra_pe_aouthdr *aout; - int idx; - char *name; - bfd_vma base; +add_data_entry (bfd * abfd, + struct internal_extra_pe_aouthdr *aout, + int idx, + char *name, + bfd_vma base) { asection *sec = bfd_get_section_by_name (abfd, name); @@ -560,10 +516,7 @@ add_data_entry (abfd, aout, idx, name, base) } unsigned int -_bfd_XXi_swap_aouthdr_out (abfd, in, out) - bfd *abfd; - PTR in; - PTR out; +_bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out) { struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *) in; pe_data_type *pe = pe_data (abfd); @@ -658,14 +611,19 @@ _bfd_XXi_swap_aouthdr_out (abfd, in, out) { asection *sec; + bfd_vma hsize = 0; bfd_vma dsize = 0; - bfd_vma isize = SA(abfd->sections->filepos); + bfd_vma isize = 0; bfd_vma tsize = 0; for (sec = abfd->sections; sec; sec = sec->next) { - int rounded = FA(sec->_raw_size); + int rounded = FA (sec->size); + /* The first non-zero section filepos is the header size. + Sections without contents will have a filepos of 0. */ + if (hsize == 0) + hsize = sec->filepos; if (sec->flags & SEC_DATA) dsize += rounded; if (sec->flags & SEC_CODE) @@ -682,10 +640,10 @@ _bfd_XXi_swap_aouthdr_out (abfd, in, out) aouthdr_in->dsize = dsize; aouthdr_in->tsize = tsize; - extra->SizeOfImage = isize; + extra->SizeOfHeaders = hsize; + extra->SizeOfImage = SA (hsize) + isize; } - extra->SizeOfHeaders = abfd->sections->filepos; H_PUT_16 (abfd, aouthdr_in->magic, aouthdr_out->standard.magic); #define LINKER_VERSION 256 /* That is, 2.56 */ @@ -754,10 +712,7 @@ _bfd_XXi_swap_aouthdr_out (abfd, in, out) } unsigned int -_bfd_XXi_only_swap_filehdr_out (abfd, in, out) - bfd *abfd; - PTR in; - PTR out; +_bfd_XXi_only_swap_filehdr_out (bfd * abfd, void * in, void * out) { int idx; struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in; @@ -865,10 +820,7 @@ _bfd_XXi_only_swap_filehdr_out (abfd, in, out) } unsigned int -_bfd_XX_only_swap_filehdr_out (abfd, in, out) - bfd *abfd; - PTR in; - PTR out; +_bfd_XX_only_swap_filehdr_out (bfd * abfd, void * in, void * out) { struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in; FILHDR *filehdr_out = (FILHDR *) out; @@ -885,10 +837,7 @@ _bfd_XX_only_swap_filehdr_out (abfd, in, out) } unsigned int -_bfd_XXi_swap_scnhdr_out (abfd, in, out) - bfd *abfd; - PTR in; - PTR out; +_bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out) { struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in; SCNHDR *scnhdr_ext = (SCNHDR *) out; @@ -983,7 +932,6 @@ _bfd_XXi_swap_scnhdr_out (abfd, in, out) }; pe_required_section_flags * p; - int flags = scnhdr_int->s_flags; /* We have defaulted to adding the IMAGE_SCN_MEM_WRITE flag, but now we know exactly what this specific section wants so we remove it @@ -998,12 +946,12 @@ _bfd_XXi_swap_scnhdr_out (abfd, in, out) { if (strcmp (scnhdr_int->s_name, ".text") || (bfd_get_file_flags (abfd) & WP_TEXT)) - flags &= ~IMAGE_SCN_MEM_WRITE; - flags |= p->must_have; + scnhdr_int->s_flags &= ~IMAGE_SCN_MEM_WRITE; + scnhdr_int->s_flags |= p->must_have; break; } - H_PUT_32 (abfd, flags, scnhdr_ext->s_flags); + H_PUT_32 (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags); } if (coff_data (abfd)->link_info @@ -1048,38 +996,30 @@ _bfd_XXi_swap_scnhdr_out (abfd, in, out) H_PUT_16 (abfd, 0xffff, scnhdr_ext->s_nreloc); scnhdr_int->s_flags |= IMAGE_SCN_LNK_NRELOC_OVFL; H_PUT_32 (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags); -#if 0 - (*_bfd_error_handler) (_("%s: reloc overflow 1: 0x%lx > 0xffff"), - bfd_get_filename (abfd), - scnhdr_int->s_nreloc); - bfd_set_error (bfd_error_file_truncated); - H_PUT_16 (abfd, 0xffff, scnhdr_ext->s_nreloc); - ret = 0; -#endif } } return ret; } static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] = - { - N_("Export Directory [.edata (or where ever we found it)]"), - N_("Import Directory [parts of .idata]"), - N_("Resource Directory [.rsrc]"), - N_("Exception Directory [.pdata]"), - N_("Security Directory"), - N_("Base Relocation Directory [.reloc]"), - N_("Debug Directory"), - N_("Description Directory"), - N_("Special Directory"), - N_("Thread Storage Directory [.tls]"), - N_("Load Configuration Directory"), - N_("Bound Import Directory"), - N_("Import Address Table Directory"), - N_("Delay Import Directory"), - N_("Reserved"), - N_("Reserved") - }; +{ + N_("Export Directory [.edata (or where ever we found it)]"), + N_("Import Directory [parts of .idata]"), + N_("Resource Directory [.rsrc]"), + N_("Exception Directory [.pdata]"), + N_("Security Directory"), + N_("Base Relocation Directory [.reloc]"), + N_("Debug Directory"), + N_("Description Directory"), + N_("Special Directory"), + N_("Thread Storage Directory [.tls]"), + N_("Load Configuration Directory"), + N_("Bound Import Directory"), + N_("Import Address Table Directory"), + N_("Delay Import Directory"), + N_("Reserved"), + N_("Reserved") +}; #ifdef POWERPC_LE_PE /* The code for the PPC really falls in the "architecture dependent" @@ -1090,9 +1030,7 @@ static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] = #endif static bfd_boolean -pe_print_idata (abfd, vfile) - bfd *abfd; - PTR vfile; +pe_print_idata (bfd * abfd, void * vfile) { FILE *file = (FILE *) vfile; bfd_byte *data; @@ -1106,7 +1044,6 @@ pe_print_idata (abfd, vfile) bfd_size_type datasize = 0; bfd_size_type dataoff; bfd_size_type i; - bfd_size_type amt; int onaline = 20; pe_data_type *pe = pe_data (abfd); @@ -1124,7 +1061,7 @@ pe_print_idata (abfd, vfile) return TRUE; addr = section->vma; - datasize = bfd_section_size (abfd, section); + datasize = section->size; if (datasize == 0) return TRUE; } @@ -1133,7 +1070,7 @@ pe_print_idata (abfd, vfile) addr += extra->ImageBase; for (section = abfd->sections; section != NULL; section = section->next) { - datasize = bfd_section_size (abfd, section); + datasize = section->size; if (addr >= section->vma && addr < section->vma + datasize) break; } @@ -1153,7 +1090,7 @@ pe_print_idata (abfd, vfile) datasize -= dataoff; #ifdef POWERPC_LE_PE - if (rel_section != 0 && bfd_section_size (abfd, rel_section) != 0) + if (rel_section != 0 && rel_section->size != 0) { /* The toc address can be found by taking the starting address, which on the PPC locates a function descriptor. The @@ -1165,19 +1102,25 @@ pe_print_idata (abfd, vfile) bfd_vma loadable_toc_address; bfd_vma toc_address; bfd_vma start_address; - bfd_byte *data = 0; - int offset; + bfd_byte *data; + bfd_vma offset; - amt = bfd_section_size (abfd, rel_section); - data = (bfd_byte *) bfd_malloc (amt); - if (data == NULL && amt != 0) - return FALSE; - - bfd_get_section_contents (abfd, rel_section, (PTR) data, (bfd_vma) 0, - amt); + if (!bfd_malloc_and_get_section (abfd, rel_section, &data)) + { + if (data != NULL) + free (data); + return FALSE; + } offset = abfd->start_address - rel_section->vma; + if (offset >= rel_section->size || offset + 8 > rel_section->size) + { + if (data != NULL) + free (data); + return FALSE; + } + start_address = bfd_get_32 (abfd, data + offset); loadable_toc_address = bfd_get_32 (abfd, data + offset + 4); toc_address = loadable_toc_address - 32768; @@ -1188,6 +1131,8 @@ pe_print_idata (abfd, vfile) fprintf (file, _("\tcode-base %08lx toc (loadable/actual) %08lx/%08lx\n"), start_address, loadable_toc_address, toc_address); + if (data != NULL) + free (data); } else { @@ -1204,14 +1149,13 @@ pe_print_idata (abfd, vfile) vma: Hint Time Forward DLL First\n\ Table Stamp Chain Name Thunk\n")); - amt = dataoff + datasize; - data = (bfd_byte *) bfd_malloc (amt); - if (data == NULL) - return FALSE; - /* Read the whole section. Some of the fields might be before dataoff. */ - if (! bfd_get_section_contents (abfd, section, (PTR) data, (bfd_vma) 0, amt)) - return FALSE; + if (!bfd_malloc_and_get_section (abfd, section, &data)) + { + if (data != NULL) + free (data); + return FALSE; + } adj = section->vma - extra->ImageBase; @@ -1229,11 +1173,6 @@ pe_print_idata (abfd, vfile) /* Print (i + extra->DataDirectory[1].VirtualAddress). */ fprintf (file, " %08lx\t", (unsigned long) (i + adj + dataoff)); -#if 0 - if (i + 20 > datasize) - /* Check stuff. */ - ; -#endif hint_addr = bfd_get_32 (abfd, data + i + dataoff); time_stamp = bfd_get_32 (abfd, data + i + 4 + dataoff); forward_chain = bfd_get_32 (abfd, data + i + 8 + dataoff); @@ -1250,6 +1189,9 @@ pe_print_idata (abfd, vfile) if (hint_addr == 0 && first_thunk == 0) break; + if (dll_name - adj >= section->size) + break; + dll = (char *) data + dll_name - adj; fprintf (file, _("\n\tDLL Name: %s\n"), dll); @@ -1278,7 +1220,7 @@ pe_print_idata (abfd, vfile) ft_section != NULL; ft_section = ft_section->next) { - ft_datasize = bfd_section_size (abfd, ft_section); + ft_datasize = ft_section->size; if (ft_addr >= ft_section->vma && ft_addr < ft_section->vma + ft_datasize) break; @@ -1301,15 +1243,13 @@ pe_print_idata (abfd, vfile) else { ft_idx = first_thunk - (ft_section->vma - extra->ImageBase); - ft_data = (bfd_byte *) bfd_malloc (datasize); + ft_data = bfd_malloc (datasize); if (ft_data == NULL) continue; /* Read datasize bfd_bytes starting at offset ft_idx. */ - if (! bfd_get_section_contents (abfd, ft_section, - (PTR) ft_data, - (bfd_vma) ft_idx, - datasize)) + if (! bfd_get_section_contents + (abfd, ft_section, ft_data, (bfd_vma) ft_idx, datasize)) { free (ft_data); continue; @@ -1367,9 +1307,7 @@ pe_print_idata (abfd, vfile) } static bfd_boolean -pe_print_edata (abfd, vfile) - bfd *abfd; - PTR vfile; +pe_print_edata (bfd * abfd, void * vfile) { FILE *file = (FILE *) vfile; bfd_byte *data; @@ -1380,17 +1318,17 @@ pe_print_edata (abfd, vfile) bfd_signed_vma adj; struct EDT_type { - long export_flags; /* reserved - should be zero */ + long export_flags; /* Reserved - should be zero. */ long time_stamp; short major_ver; short minor_ver; - bfd_vma name; /* rva - relative to image base */ - long base; /* ordinal base */ - unsigned long num_functions;/* Number in the export address table */ - unsigned long num_names; /* Number in the name pointer table */ - bfd_vma eat_addr; /* rva to the export address table */ - bfd_vma npt_addr; /* rva to the Export Name Pointer Table */ - bfd_vma ot_addr; /* rva to the Ordinal Table */ + bfd_vma name; /* RVA - relative to image base. */ + long base; /* Ordinal base. */ + unsigned long num_functions;/* Number in the export address table. */ + unsigned long num_names; /* Number in the name pointer table. */ + bfd_vma eat_addr; /* RVA to the export address table. */ + bfd_vma npt_addr; /* RVA to the Export Name Pointer Table. */ + bfd_vma ot_addr; /* RVA to the Ordinal Table. */ } edt; pe_data_type *pe = pe_data (abfd); @@ -1408,7 +1346,8 @@ pe_print_edata (abfd, vfile) return TRUE; addr = section->vma; - datasize = bfd_section_size (abfd, section); + dataoff = 0; + datasize = section->size; if (datasize == 0) return TRUE; } @@ -1417,12 +1356,8 @@ pe_print_edata (abfd, vfile) addr += extra->ImageBase; for (section = abfd->sections; section != NULL; section = section->next) - { - datasize = bfd_section_size (abfd, section); - - if (addr >= section->vma && addr < section->vma + datasize) - break; - } + if (addr >= section->vma && addr < section->vma + section->size) + break; if (section == NULL) { @@ -1430,19 +1365,26 @@ pe_print_edata (abfd, vfile) _("\nThere is an export table, but the section containing it could not be found\n")); return TRUE; } + + dataoff = addr - section->vma; + datasize = extra->DataDirectory[0].Size; + if (datasize > section->size - dataoff) + { + fprintf (file, + _("\nThere is an export table in %s, but it does not fit into that section\n"), + section->name); + return TRUE; + } } fprintf (file, _("\nThere is an export table in %s at 0x%lx\n"), section->name, (unsigned long) addr); - dataoff = addr - section->vma; - datasize -= dataoff; - - data = (bfd_byte *) bfd_malloc (datasize); + data = bfd_malloc (datasize); if (data == NULL) return FALSE; - if (! bfd_get_section_contents (abfd, section, (PTR) data, + if (! bfd_get_section_contents (abfd, section, data, (file_ptr) dataoff, datasize)) return FALSE; @@ -1519,8 +1461,7 @@ pe_print_edata (abfd, vfile) { long export_rva; long forwarder_rva; - } export_address_table_entry; - */ + } export_address_table_entry; */ fprintf (file, _("\nExport Address Table -- Ordinal Base %ld\n"), @@ -1590,9 +1531,7 @@ pe_print_edata (abfd, vfile) covers and the address of the corresponding unwind info data. */ static bfd_boolean -pe_print_pdata (abfd, vfile) - bfd *abfd; - PTR vfile; +pe_print_pdata (bfd * abfd, void * vfile) { #ifdef COFF_WITH_pep # define PDATA_ROW_SIZE (3*8) @@ -1629,16 +1568,16 @@ pe_print_pdata (abfd, vfile) \t\tAddress Address Handler Data Address Mask\n")); #endif - datasize = bfd_section_size (abfd, section); + datasize = section->size; if (datasize == 0) return TRUE; - data = (bfd_byte *) bfd_malloc (datasize); - if (data == NULL && datasize != 0) - return FALSE; - - bfd_get_section_contents (abfd, section, (PTR) data, (bfd_vma) 0, - datasize); + if (! bfd_malloc_and_get_section (abfd, section, &data)) + { + if (data != NULL) + free (data); + return FALSE; + } start = 0; @@ -1685,12 +1624,12 @@ pe_print_pdata (abfd, vfile) if (eh_handler == 0 && eh_data != 0) { /* Special bits here, although the meaning may be a little - mysterious. The only one I know for sure is 0x03. */ - /* Code Significance */ - /* 0x00 None */ - /* 0x01 Register Save Millicode */ - /* 0x02 Register Restore Millicode */ - /* 0x03 Glue Code Sequence */ + mysterious. The only one I know for sure is 0x03 + Code Significance + 0x00 None + 0x01 Register Save Millicode + 0x02 Register Restore Millicode + 0x03 Glue Code Sequence. */ switch (eh_data) { case 0x01: @@ -1717,26 +1656,24 @@ pe_print_pdata (abfd, vfile) #define IMAGE_REL_BASED_HIGHADJ 4 static const char * const tbl[] = - { - "ABSOLUTE", - "HIGH", - "LOW", - "HIGHLOW", - "HIGHADJ", - "MIPS_JMPADDR", - "SECTION", - "REL32", - "RESERVED1", - "MIPS_JMPADDR16", - "DIR64", - "HIGH3ADJ" - "UNKNOWN", /* MUST be last */ - }; +{ + "ABSOLUTE", + "HIGH", + "LOW", + "HIGHLOW", + "HIGHADJ", + "MIPS_JMPADDR", + "SECTION", + "REL32", + "RESERVED1", + "MIPS_JMPADDR16", + "DIR64", + "HIGH3ADJ", + "UNKNOWN", /* MUST be last. */ +}; static bfd_boolean -pe_print_reloc (abfd, vfile) - bfd *abfd; - PTR vfile; +pe_print_reloc (bfd * abfd, void * vfile) { FILE *file = (FILE *) vfile; bfd_byte *data = 0; @@ -1748,23 +1685,23 @@ pe_print_reloc (abfd, vfile) if (section == NULL) return TRUE; - if (bfd_section_size (abfd, section) == 0) + if (section->size == 0) return TRUE; fprintf (file, _("\n\nPE File Base Relocations (interpreted .reloc section contents)\n")); - datasize = bfd_section_size (abfd, section); - data = (bfd_byte *) bfd_malloc (datasize); - if (data == NULL && datasize != 0) - return FALSE; - - bfd_get_section_contents (abfd, section, (PTR) data, (bfd_vma) 0, - datasize); + datasize = section->size; + if (! bfd_malloc_and_get_section (abfd, section, &data)) + { + if (data != NULL) + free (data); + return FALSE; + } start = 0; - stop = bfd_section_size (abfd, section); + stop = section->size; for (i = start; i < stop;) { @@ -1822,9 +1759,7 @@ pe_print_reloc (abfd, vfile) /* Print out the program headers. */ bfd_boolean -_bfd_XX_print_private_bfd_data_common (abfd, vfile) - bfd *abfd; - PTR vfile; +_bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile) { FILE *file = (FILE *) vfile; int j; @@ -1838,16 +1773,17 @@ _bfd_XX_print_private_bfd_data_common (abfd, vfile) fprintf (file, _("\nCharacteristics 0x%x\n"), pe->real_flags); #undef PF #define PF(x, y) if (pe->real_flags & x) { fprintf (file, "\t%s\n", y); } - PF (F_RELFLG, "relocations stripped"); - PF (F_EXEC, "executable"); - PF (F_LNNO, "line numbers stripped"); - PF (F_LSYMS, "symbols stripped"); - PF (0x80, "little endian"); - PF (F_AR32WR, "32 bit words"); - PF (0x200, "debugging information removed"); - PF (0x1000, "system file"); - PF (F_DLL, "DLL"); - PF (0x8000, "big endian"); + PF (IMAGE_FILE_RELOCS_STRIPPED, "relocations stripped"); + PF (IMAGE_FILE_EXECUTABLE_IMAGE, "executable"); + PF (IMAGE_FILE_LINE_NUMS_STRIPPED, "line numbers stripped"); + PF (IMAGE_FILE_LOCAL_SYMS_STRIPPED, "symbols stripped"); + PF (IMAGE_FILE_LARGE_ADDRESS_AWARE, "large address aware"); + PF (IMAGE_FILE_BYTES_REVERSED_LO, "little endian"); + PF (IMAGE_FILE_32BIT_MACHINE, "32 bit words"); + PF (IMAGE_FILE_DEBUG_STRIPPED, "debugging information removed"); + PF (IMAGE_FILE_SYSTEM, "system file"); + PF (IMAGE_FILE_DLL, "DLL"); + PF (IMAGE_FILE_BYTES_REVERSED_HI, "big endian"); #undef PF /* ctime implies '\n'. */ @@ -1939,8 +1875,7 @@ _bfd_XX_print_private_bfd_data_common (abfd, vfile) to the output bfd. */ bfd_boolean -_bfd_XX_bfd_copy_private_bfd_data_common (ibfd, obfd) - bfd *ibfd, *obfd; +_bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd) { /* One day we may try to grok other private data. */ if (ibfd->xvec->flavour != bfd_target_coff_flavour @@ -1963,11 +1898,10 @@ _bfd_XX_bfd_copy_private_bfd_data_common (ibfd, obfd) /* Copy private section data. */ bfd_boolean -_bfd_XX_bfd_copy_private_section_data (ibfd, isec, obfd, osec) - bfd *ibfd; - asection *isec; - bfd *obfd; - asection *osec; +_bfd_XX_bfd_copy_private_section_data (bfd *ibfd, + asection *isec, + bfd *obfd, + asection *osec) { if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour || bfd_get_flavour (obfd) != bfd_target_coff_flavour) @@ -1979,7 +1913,7 @@ _bfd_XX_bfd_copy_private_section_data (ibfd, isec, obfd, osec) if (coff_section_data (obfd, osec) == NULL) { bfd_size_type amt = sizeof (struct coff_section_tdata); - osec->used_by_bfd = (PTR) bfd_zalloc (obfd, amt); + osec->used_by_bfd = bfd_zalloc (obfd, amt); if (osec->used_by_bfd == NULL) return FALSE; } @@ -1987,7 +1921,7 @@ _bfd_XX_bfd_copy_private_section_data (ibfd, isec, obfd, osec) if (pei_section_data (obfd, osec) == NULL) { bfd_size_type amt = sizeof (struct pei_section_tdata); - coff_section_data (obfd, osec)->tdata = (PTR) bfd_zalloc (obfd, amt); + coff_section_data (obfd, osec)->tdata = bfd_zalloc (obfd, amt); if (coff_section_data (obfd, osec)->tdata == NULL) return FALSE; } @@ -2002,29 +1936,16 @@ _bfd_XX_bfd_copy_private_section_data (ibfd, isec, obfd, osec) } void -_bfd_XX_get_symbol_info (abfd, symbol, ret) - bfd *abfd; - asymbol *symbol; - symbol_info *ret; +_bfd_XX_get_symbol_info (bfd * abfd, asymbol *symbol, symbol_info *ret) { coff_get_symbol_info (abfd, symbol, ret); -#if 0 /* This code no longer appears to be necessary. - ImageBase has already been added in by coff_swap_scnhdr_in. */ - if (pe_data (abfd) != NULL - && ((symbol->flags & BSF_DEBUGGING) == 0 - || (symbol->flags & BSF_DEBUGGING_RELOC) != 0) - && ! bfd_is_abs_section (symbol->section)) - ret->value += pe_data (abfd)->pe_opthdr.ImageBase; -#endif } /* Handle the .idata section and other things that need symbol table access. */ bfd_boolean -_bfd_XXi_final_link_postscript (abfd, pfinfo) - bfd *abfd; - struct coff_final_link_info *pfinfo; +_bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) { struct coff_link_hash_entry *h1; struct bfd_link_info *info = pfinfo->info; |