X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2FpeXXigen.c;h=77fb4933e73e61d466ade551be8f6d79b509cbe7;hb=d106773eaca95698838b930a7b512469a38a6771;hp=e01cfcdd6726328b5574221ded2fa128a1e06ece;hpb=1b7868733d45220e63b72a1814f30e090f761821;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c index e01cfcdd67..77fb4933e7 100644 --- a/bfd/peXXigen.c +++ b/bfd/peXXigen.c @@ -1,5 +1,5 @@ /* Support for the generic parts of PE/PEI; the common executable parts. - Copyright (C) 1995-2015 Free Software Foundation, Inc. + Copyright (C) 1995-2019 Free Software Foundation, Inc. Written by Cygnus Solutions. This file is part of BFD, the Binary File Descriptor library. @@ -62,6 +62,7 @@ #include "libbfd.h" #include "coff/internal.h" #include "bfdver.h" +#include "libiberty.h" #ifdef HAVE_WCHAR_H #include #endif @@ -119,7 +120,7 @@ _bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1) memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN); in->n_value = H_GET_32 (abfd, ext->e_value); - in->n_scnum = H_GET_16 (abfd, ext->e_scnum); + in->n_scnum = (short) H_GET_16 (abfd, ext->e_scnum); if (sizeof (ext->e_type) == 2) in->n_type = H_GET_16 (abfd, ext->e_type); @@ -153,7 +154,7 @@ _bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1) name = _bfd_coff_internal_syment_name (abfd, in, namebuf); if (name == NULL) { - _bfd_error_handler (_("%B: unable to find name for empty section"), + _bfd_error_handler (_("%pB: unable to find name for empty section"), abfd); bfd_set_error (bfd_error_invalid_target); return; @@ -179,7 +180,7 @@ _bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1) name = (const char *) bfd_alloc (abfd, strlen (namebuf) + 1); if (name == NULL) { - _bfd_error_handler (_("%B: out of memory creating name for empty section"), + _bfd_error_handler (_("%pB: out of memory creating name for empty section"), abfd); return; } @@ -190,7 +191,7 @@ _bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1) sec = bfd_make_section_anyway_with_flags (abfd, name, flags); if (sec == NULL) { - _bfd_error_handler (_("%B: unable to create fake empty section"), + _bfd_error_handler (_("%pB: unable to create fake empty section"), abfd); return; } @@ -257,7 +258,7 @@ _bfd_XXi_swap_sym_out (bfd * abfd, void * inp, void * extp) as the worst that can happen is that some absolute symbols are needlessly converted into section relative symbols. */ && in->n_value > ((1ULL << (sizeof (in->n_value) > 4 ? 32 : 31)) - 1) - && in->n_scnum == -1) + && in->n_scnum == N_ABS) { asection * sec; @@ -293,7 +294,7 @@ _bfd_XXi_swap_aux_in (bfd * abfd, int in_class, int indx ATTRIBUTE_UNUSED, int numaux ATTRIBUTE_UNUSED, - void * in1) + void * in1) { AUXENT *ext = (AUXENT *) ext1; union internal_auxent *in = (union internal_auxent *) in1; @@ -521,14 +522,15 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd, a->NumberOfRvaAndSizes = H_GET_32 (abfd, src->NumberOfRvaAndSizes); { - int idx; + unsigned idx; /* PR 17512: Corrupt PE binaries can cause seg-faults. */ if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES) { - (*_bfd_error_handler) - (_("%B: aout header specifies an invalid number of data-directory entries: %d"), - abfd, a->NumberOfRvaAndSizes); + /* xgettext:c-format */ + _bfd_error_handler + (_("%pB: aout header specifies an invalid number of" + " data-directory entries: %u"), abfd, a->NumberOfRvaAndSizes); bfd_set_error (bfd_error_bad_value); /* Paranoia: If the number is corrupt, then assume that the @@ -538,7 +540,7 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd, for (idx = 0; idx < a->NumberOfRvaAndSizes; idx++) { - /* If data directory is empty, rva also should be 0. */ + /* If data directory is empty, rva also should be 0. */ int size = H_GET_32 (abfd, src->DataDirectory[idx][1]); @@ -673,9 +675,9 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out) extra->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES; - add_data_entry (abfd, extra, 0, ".edata", ib); - add_data_entry (abfd, extra, 2, ".rsrc", ib); - add_data_entry (abfd, extra, 3, ".pdata", ib); + add_data_entry (abfd, extra, PE_EXPORT_TABLE, ".edata", ib); + add_data_entry (abfd, extra, PE_RESOURCE_TABLE, ".rsrc", ib); + add_data_entry (abfd, extra, PE_EXCEPTION_TABLE, ".pdata", ib); /* In theory we do not need to call add_data_entry for .idata$2 or .idata$5. It will be done in bfd_coff_final_link where all the @@ -693,7 +695,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out) if (extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress == 0) /* Until other .idata fixes are made (pending patch), the entry for .idata is needed for backwards compatibility. FIXME. */ - add_data_entry (abfd, extra, 1, ".idata", ib); + add_data_entry (abfd, extra, PE_IMPORT_TABLE, ".idata", ib); /* For some reason, the virtual size (which is what's set by add_data_entry) for .reloc is not the same as the size recorded @@ -701,7 +703,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out) but since it's the best we've got, use it. It does do the right thing for .pdata. */ if (pe->has_reloc_section) - add_data_entry (abfd, extra, 5, ".reloc", ib); + add_data_entry (abfd, extra, PE_BASE_RELOCATION_TABLE, ".reloc", ib); { asection *sec; @@ -826,7 +828,7 @@ _bfd_XXi_only_swap_filehdr_out (bfd * abfd, void * in, void * out) if (pe_data (abfd)->dll) filehdr_in->f_flags |= F_DLL; - filehdr_in->pe.e_magic = DOSMAGIC; + filehdr_in->pe.e_magic = IMAGE_DOS_SIGNATURE; filehdr_in->pe.e_cblp = 0x90; filehdr_in->pe.e_cp = 0x3; filehdr_in->pe.e_crlc = 0x0; @@ -870,14 +872,17 @@ _bfd_XXi_only_swap_filehdr_out (bfd * abfd, void * in, void * out) filehdr_in->pe.dos_message[13] = 0x0a0d0d2e; filehdr_in->pe.dos_message[14] = 0x24; filehdr_in->pe.dos_message[15] = 0x0; - filehdr_in->pe.nt_signature = NT_SIGNATURE; + filehdr_in->pe.nt_signature = IMAGE_NT_SIGNATURE; H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic); H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns); - /* Only use a real timestamp if the option was chosen. */ + /* Use a real timestamp by default, unless the no-insert-timestamp + option was chosen. */ if ((pe_data (abfd)->insert_timestamp)) H_PUT_32 (abfd, time (0), filehdr_out->f_timdat); + else + H_PUT_32 (abfd, 0, filehdr_out->f_timdat); PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr, filehdr_out->f_symptr); @@ -970,8 +975,8 @@ _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out) } else { - ps = 0; - ss = scnhdr_int->s_size; + ps = 0; + ss = scnhdr_int->s_size; } } else @@ -1014,7 +1019,7 @@ _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out) typedef struct { - const char * section_name; + char section_name[SCNNMLEN]; unsigned long must_have; } pe_required_section_flags; @@ -1033,7 +1038,6 @@ _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out) { ".text" , IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE }, { ".tls", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE }, { ".xdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA }, - { NULL, 0} }; pe_required_section_flags * p; @@ -1046,10 +1050,12 @@ _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out) by ld --enable-auto-import (if auto-import is actually needed), by ld --omagic, or by obcopy --writable-text. */ - for (p = known_sections; p->section_name; p++) - if (strcmp (scnhdr_int->s_name, p->section_name) == 0) + for (p = known_sections; + p < known_sections + ARRAY_SIZE (known_sections); + p++) + if (memcmp (scnhdr_int->s_name, p->section_name, SCNNMLEN) == 0) { - if (strcmp (scnhdr_int->s_name, ".text") + if (memcmp (scnhdr_int->s_name, ".text", sizeof ".text") || (bfd_get_file_flags (abfd) & WP_TEXT)) scnhdr_int->s_flags &= ~IMAGE_SCN_MEM_WRITE; scnhdr_int->s_flags |= p->must_have; @@ -1060,9 +1066,9 @@ _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out) } if (coff_data (abfd)->link_info - && ! coff_data (abfd)->link_info->relocatable - && ! coff_data (abfd)->link_info->shared - && strcmp (scnhdr_int->s_name, ".text") == 0) + && ! bfd_link_relocatable (coff_data (abfd)->link_info) + && ! bfd_link_pic (coff_data (abfd)->link_info) + && memcmp (scnhdr_int->s_name, ".text", sizeof ".text") == 0) { /* By inference from looking at MS output, the 32 bit field which is the combination of the number_of_relocs and @@ -1081,18 +1087,18 @@ _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out) H_PUT_16 (abfd, scnhdr_int->s_nlnno, scnhdr_ext->s_nlnno); else { - (*_bfd_error_handler) (_("%s: line number overflow: 0x%lx > 0xffff"), - bfd_get_filename (abfd), - scnhdr_int->s_nlnno); + /* xgettext:c-format */ + _bfd_error_handler (_("%pB: line number overflow: 0x%lx > 0xffff"), + abfd, scnhdr_int->s_nlnno); bfd_set_error (bfd_error_file_truncated); H_PUT_16 (abfd, 0xffff, scnhdr_ext->s_nlnno); ret = 0; } /* Although we could encode 0xffff relocs here, we do not, to be - consistent with other parts of bfd. Also it lets us warn, as - we should never see 0xffff here w/o having the overflow flag - set. */ + consistent with other parts of bfd. Also it lets us warn, as + we should never see 0xffff here w/o having the overflow flag + set. */ if (scnhdr_int->s_nreloc < 0xffff) H_PUT_16 (abfd, scnhdr_int->s_nreloc, scnhdr_ext->s_nreloc); else @@ -1165,8 +1171,8 @@ _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length cvinfo->Age = H_GET_32(abfd, cvinfo70->Age); /* A GUID consists of 4,2,2 byte values in little-endian order, followed - by 8 single bytes. Byte swap them so we can conveniently treat the GUID - as 16 bytes in big-endian order. */ + by 8 single bytes. Byte swap them so we can conveniently treat the GUID + as 16 bytes in big-endian order. */ bfd_putb32 (bfd_getl32 (cvinfo70->Signature), cvinfo->Signature); bfd_putb16 (bfd_getl16 (&(cvinfo70->Signature[4])), &(cvinfo->Signature[4])); bfd_putb16 (bfd_getl16 (&(cvinfo70->Signature[6])), &(cvinfo->Signature[6])); @@ -1178,7 +1184,7 @@ _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length return cvinfo; } else if ((cvinfo->CVSignature == CVINFO_PDB20_CVSIGNATURE) - && (length > sizeof (CV_INFO_PDB20))) + && (length > sizeof (CV_INFO_PDB20))) { CV_INFO_PDB20 *cvinfo20 = (CV_INFO_PDB20 *)(buffer); cvinfo->Age = H_GET_32(abfd, cvinfo20->Age); @@ -1195,13 +1201,15 @@ _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length unsigned int _bfd_XXi_write_codeview_record (bfd * abfd, file_ptr where, CODEVIEW_INFO *cvinfo) { - unsigned int size = sizeof (CV_INFO_PDB70) + 1; + const bfd_size_type size = sizeof (CV_INFO_PDB70) + 1; + bfd_size_type written; CV_INFO_PDB70 *cvinfo70; - char buffer[size]; + char * buffer; if (bfd_seek (abfd, where, SEEK_SET) != 0) return 0; + buffer = xmalloc (size); cvinfo70 = (CV_INFO_PDB70 *) buffer; H_PUT_32 (abfd, CVINFO_PDB70_CVSIGNATURE, cvinfo70->CvSignature); @@ -1215,10 +1223,11 @@ _bfd_XXi_write_codeview_record (bfd * abfd, file_ptr where, CODEVIEW_INFO *cvinf H_PUT_32 (abfd, cvinfo->Age, cvinfo70->Age); cvinfo70->PdbFileName[0] = '\0'; - if (bfd_bwrite (buffer, size, abfd) != size) - return 0; + written = bfd_bwrite (buffer, size, abfd); - return size; + free (buffer); + + return written == size ? size : 0; } static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] = @@ -1302,14 +1311,15 @@ pe_print_idata (bfd * abfd, void * vfile) return TRUE; } else if (!(section->flags & SEC_HAS_CONTENTS)) - { + { fprintf (file, _("\nThere is an import table in %s, but that section has no contents\n"), section->name); return TRUE; - } + } } + /* xgettext:c-format */ fprintf (file, _("\nThere is an import table in %s at 0x%lx\n"), section->name, (unsigned long) addr); @@ -1341,11 +1351,11 @@ pe_print_idata (bfd * abfd, void * vfile) offset = abfd->start_address - rel_section->vma; if (offset >= rel_section->size || offset + 8 > rel_section->size) - { - if (data != NULL) - free (data); - return FALSE; - } + { + 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); @@ -1355,6 +1365,7 @@ pe_print_idata (bfd * abfd, void * vfile) _("\nFunction descriptor located at the start address: %04lx\n"), (unsigned long int) (abfd->start_address)); fprintf (file, + /* xgettext:c-format */ _("\tcode-base %08lx toc (loadable/actual) %08lx/%08lx\n"), start_address, loadable_toc_address, toc_address); if (data != NULL) @@ -1416,14 +1427,19 @@ pe_print_idata (bfd * abfd, void * vfile) break; if (dll_name - adj >= section->size) - break; + break; dll = (char *) data + dll_name - adj; /* PR 17512 file: 078-12277-0.004. */ bfd_size_type maxlen = (char *)(data + datasize) - dll - 1; fprintf (file, _("\n\tDLL Name: %.*s\n"), (int) maxlen, dll); - if (hint_addr != 0) + /* PR 21546: When the Hint Address is zero, + we try the First Thunk instead. */ + if (hint_addr == 0) + hint_addr = first_thunk; + + if (hint_addr != 0 && hint_addr - adj < datasize) { bfd_byte *ft_data; asection *ft_section; @@ -1500,7 +1516,7 @@ pe_print_idata (bfd * abfd, void * vfile) member_high, member, WithoutHighBit (member_high), member); /* PR binutils/17512: Handle corrupt PE data. */ - else if (amt + 2 >= datasize) + else if (amt >= datasize || amt + 2 >= datasize) fprintf (file, _("\t"), member); else { @@ -1534,11 +1550,12 @@ pe_print_idata (bfd * abfd, void * vfile) break; amt = member - adj; + if (HighBitSet (member)) fprintf (file, "\t%04lx\t %4lu ", member, WithoutHighBit (member)); /* PR binutils/17512: Handle corrupt PE data. */ - else if (amt + 2 >= datasize) + else if (amt >= datasize || amt + 2 >= datasize) fprintf (file, _("\t"), member); else { @@ -1588,14 +1605,14 @@ pe_print_edata (bfd * abfd, void * vfile) bfd_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. */ + 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. */ + 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. */ @@ -1636,16 +1653,17 @@ pe_print_edata (bfd * abfd, void * vfile) return TRUE; } else if (!(section->flags & SEC_HAS_CONTENTS)) - { + { fprintf (file, _("\nThere is an export table in %s, but that section has no contents\n"), section->name); return TRUE; - } + } dataoff = addr - section->vma; datasize = extra->DataDirectory[PE_EXPORT_TABLE].Size; - if (datasize > section->size - dataoff) + if (dataoff > section->size + || datasize > section->size - dataoff) { fprintf (file, _("\nThere is an export table in %s, but it does not fit into that section\n"), @@ -1655,14 +1673,16 @@ pe_print_edata (bfd * abfd, void * vfile) } /* PR 17512: Handle corrupt PE binaries. */ - if (datasize < 36) + if (datasize < 40) { fprintf (file, + /* xgettext:c-format */ _("\nThere is an export table in %s, but it is too small (%d)\n"), section->name, (int) datasize); return TRUE; } + /* xgettext:c-format */ fprintf (file, _("\nThere is an export table in %s at 0x%lx\n"), section->name, (unsigned long) addr); @@ -1675,17 +1695,17 @@ pe_print_edata (bfd * abfd, void * vfile) return FALSE; /* Go get Export Directory Table. */ - edt.export_flags = bfd_get_32 (abfd, data + 0); - edt.time_stamp = bfd_get_32 (abfd, data + 4); - edt.major_ver = bfd_get_16 (abfd, data + 8); - edt.minor_ver = bfd_get_16 (abfd, data + 10); - edt.name = bfd_get_32 (abfd, data + 12); - edt.base = bfd_get_32 (abfd, data + 16); + edt.export_flags = bfd_get_32 (abfd, data + 0); + edt.time_stamp = bfd_get_32 (abfd, data + 4); + edt.major_ver = bfd_get_16 (abfd, data + 8); + edt.minor_ver = bfd_get_16 (abfd, data + 10); + edt.name = bfd_get_32 (abfd, data + 12); + edt.base = bfd_get_32 (abfd, data + 16); edt.num_functions = bfd_get_32 (abfd, data + 20); - edt.num_names = bfd_get_32 (abfd, data + 24); - edt.eat_addr = bfd_get_32 (abfd, data + 28); - edt.npt_addr = bfd_get_32 (abfd, data + 32); - edt.ot_addr = bfd_get_32 (abfd, data + 36); + edt.num_names = bfd_get_32 (abfd, data + 24); + edt.eat_addr = bfd_get_32 (abfd, data + 28); + edt.npt_addr = bfd_get_32 (abfd, data + 32); + edt.ot_addr = bfd_get_32 (abfd, data + 36); adj = section->vma - extra->ImageBase + dataoff; @@ -1701,6 +1721,7 @@ pe_print_edata (bfd * abfd, void * vfile) _("Time/Date stamp \t\t%lx\n"), (unsigned long) edt.time_stamp); fprintf (file, + /* xgettext:c-format */ _("Major/Minor \t\t\t%d/%d\n"), edt.major_ver, edt.minor_ver); fprintf (file, @@ -1750,8 +1771,8 @@ pe_print_edata (bfd * abfd, void * vfile) forward the call to another dll. Something like: typedef union { - long export_rva; - long forwarder_rva; + long export_rva; + long forwarder_rva; } export_address_table_entry; */ fprintf (file, @@ -1759,11 +1780,11 @@ pe_print_edata (bfd * abfd, void * vfile) edt.base); /* PR 17512: Handle corrupt PE binaries. */ - if (edt.eat_addr + (edt.num_functions * 4) - adj >= datasize + /* PR 17512 file: 140-165018-0.004. */ + if (edt.eat_addr - adj >= datasize /* PR 17512: file: 092b1829 */ - || (edt.num_functions * 4) < edt.num_functions - /* PR 17512 file: 140-165018-0.004. */ - || data + edt.eat_addr - adj < data) + || (edt.num_functions + 1) * 4 < edt.num_functions + || edt.eat_addr - adj + (edt.num_functions + 1) * 4 > datasize) fprintf (file, _("\tInvalid Export Address Table rva (0x%lx) or entry count (0x%lx)\n"), (long) edt.eat_addr, (long) edt.num_functions); @@ -1809,12 +1830,14 @@ pe_print_edata (bfd * abfd, void * vfile) /* PR 17512: file: bb68816e. */ || edt.num_names * 4 < edt.num_names || (data + edt.npt_addr - adj) < data) + /* xgettext:c-format */ fprintf (file, _("\tInvalid Name Pointer Table rva (0x%lx) or entry count (0x%lx)\n"), (long) edt.npt_addr, (long) edt.num_names); /* PR 17512: file: 140-147171-0.004. */ else if (edt.ot_addr + (edt.num_names * 2) - adj >= datasize || data + edt.ot_addr - adj < data) + /* xgettext:c-format */ fprintf (file, _("\tInvalid Ordinal Table rva (0x%lx) or entry count (0x%lx)\n"), (long) edt.ot_addr, (long) edt.num_names); @@ -1828,6 +1851,7 @@ pe_print_edata (bfd * abfd, void * vfile) if ((name_ptr - adj) >= datasize) { + /* xgettext:c-format */ fprintf (file, _("\t[%4ld] \n"), (long) ord, (long) name_ptr); } @@ -1881,7 +1905,8 @@ pe_print_pdata (bfd * abfd, void * vfile) stop = pei_section_data (abfd, section)->virt_size; if ((stop % onaline) != 0) fprintf (file, - _("Warning, .pdata section size (%ld) is not a multiple of %d\n"), + /* xgettext:c-format */ + _("warning, .pdata section size (%ld) is not a multiple of %d\n"), (long) stop, onaline); fprintf (file, @@ -1902,6 +1927,7 @@ pe_print_pdata (bfd * abfd, void * vfile) /* PR 17512: file: 002-193900-0.004. */ if (datasize < stop) { + /* xgettext:c-format */ fprintf (file, _("Virtual size of .pdata section (%ld) larger than real size (%ld)\n"), (long) stop, (long) datasize); return FALSE; @@ -1930,10 +1956,10 @@ pe_print_pdata (bfd * abfd, void * vfile) if (i + PDATA_ROW_SIZE > stop) break; - begin_addr = GET_PDATA_ENTRY (abfd, data + i ); - end_addr = GET_PDATA_ENTRY (abfd, data + i + 4); + begin_addr = GET_PDATA_ENTRY (abfd, data + i ); + end_addr = GET_PDATA_ENTRY (abfd, data + i + 4); eh_handler = GET_PDATA_ENTRY (abfd, data + i + 8); - eh_data = GET_PDATA_ENTRY (abfd, data + i + 12); + eh_data = GET_PDATA_ENTRY (abfd, data + i + 12); prolog_end_addr = GET_PDATA_ENTRY (abfd, data + i + 16); if (begin_addr == 0 && end_addr == 0 && eh_handler == 0 @@ -1996,7 +2022,7 @@ pe_print_pdata (bfd * abfd, void * vfile) typedef struct sym_cache { - int symcount; + int symcount; asymbol ** syms; } sym_cache; @@ -2076,7 +2102,8 @@ _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile) stop = pei_section_data (abfd, section)->virt_size; if ((stop % onaline) != 0) fprintf (file, - _("Warning, .pdata section size (%ld) is not a multiple of %d\n"), + /* xgettext:c-format */ + _("warning, .pdata section size (%ld) is not a multiple of %d\n"), (long) stop, onaline); fprintf (file, @@ -2130,8 +2157,8 @@ _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile) fprintf (file, "%2d %2d ", flag32bit, exception_flag); /* Get the exception handler's address and the data passed from the - .text section. This is really the data that belongs with the .pdata - but got "compressed" out for the ARM and SH4 architectures. */ + .text section. This is really the data that belongs with the .pdata + but got "compressed" out for the ARM and SH4 architectures. */ tsection = bfd_get_section_by_name (abfd, ".text"); if (tsection && coff_section_data (abfd, tsection) && pei_section_data (abfd, tsection)) @@ -2233,10 +2260,11 @@ pe_print_reloc (bfd * abfd, void * vfile) break; fprintf (file, + /* xgettext:c-format */ _("\nVirtual Address: %08lx Chunk size %ld (0x%lx) Number of fixups %ld\n"), (unsigned long) virtual_address, size, size, number); - chunk_end = p + size; + chunk_end = p - 8 + size; if (chunk_end > end) chunk_end = end; j = 0; @@ -2250,6 +2278,7 @@ pe_print_reloc (bfd * abfd, void * vfile) t = (sizeof (tbl) / sizeof (tbl[0])) - 1; fprintf (file, + /* xgettext:c-format */ _("\treloc %4d offset %4x [%4lx] %s"), j, off, (unsigned long) (off + virtual_address), tbl[t]); @@ -2296,13 +2325,13 @@ rsrc_print_resource_directory (FILE * , bfd *, unsigned int, bfd_byte *, or section_end + 1 upon failure. */ static bfd_byte * -rsrc_print_resource_entries (FILE * file, - bfd * abfd, +rsrc_print_resource_entries (FILE * file, + bfd * abfd, unsigned int indent, bfd_boolean is_name, - bfd_byte * data, + bfd_byte * data, rsrc_regions * regions, - bfd_vma rva_bias) + bfd_vma rva_bias) { unsigned long entry, addr, size; bfd_byte * leaf; @@ -2310,6 +2339,7 @@ rsrc_print_resource_entries (FILE * file, if (data + 8 >= regions->section_end) return regions->section_end + 1; + /* xgettext:c-format */ fprintf (file, _("%03x %*.s Entry: "), (int)(data - regions->section_start), indent, " "); entry = (unsigned long) bfd_get_32 (abfd, data); @@ -2393,6 +2423,7 @@ rsrc_print_resource_entries (FILE * file, || leaf < regions->section_start) return regions->section_end + 1; + /* xgettext:c-format */ fprintf (file, _("%03x %*.s Leaf: Addr: %#08lx, Size: %#08lx, Codepage: %d\n"), (int) (entry), indent, " ", addr = (long) bfd_get_32 (abfd, leaf), @@ -2415,12 +2446,12 @@ rsrc_print_resource_entries (FILE * file, #define min(a,b) ((a) < (b) ? (a) : (b)) static bfd_byte * -rsrc_print_resource_directory (FILE * file, - bfd * abfd, +rsrc_print_resource_directory (FILE * file, + bfd * abfd, unsigned int indent, bfd_byte * data, rsrc_regions * regions, - bfd_vma rva_bias) + bfd_vma rva_bias) { unsigned int num_names, num_ids; bfd_byte * highest_data = data; @@ -2442,6 +2473,7 @@ rsrc_print_resource_directory (FILE * file, return regions->section_end + 1; } + /* xgettext:c-format */ fprintf (file, _(" Table: Char: %d, Time: %08lx, Ver: %d/%d, Num Names: %d, IDs: %d\n"), (int) bfd_get_32 (abfd, data), (long) bfd_get_32 (abfd, data + 4), @@ -2561,10 +2593,10 @@ rsrc_print_section (bfd * abfd, void * vfile) } if (regions.strings_start != NULL) - fprintf (file, " String table starts at offset: %#03x\n", + fprintf (file, _(" String table starts at offset: %#03x\n"), (int) (regions.strings_start - regions.section_start)); if (regions.resource_start != NULL) - fprintf (file, " Resources start at offset: %#03x\n", + fprintf (file, _(" Resources start at offset: %#03x\n"), (int) (regions.resource_start - regions.section_start)); free (regions.section_start); @@ -2610,27 +2642,27 @@ pe_print_debugdata (bfd * abfd, void * vfile) for (section = abfd->sections; section != NULL; section = section->next) { if ((addr >= section->vma) && (addr < (section->vma + section->size))) - break; + break; } if (section == NULL) { fprintf (file, - _("\nThere is a debug directory, but the section containing it could not be found\n")); + _("\nThere is a debug directory, but the section containing it could not be found\n")); return TRUE; } else if (!(section->flags & SEC_HAS_CONTENTS)) { fprintf (file, - _("\nThere is a debug directory in %s, but that section has no contents\n"), - section->name); + _("\nThere is a debug directory in %s, but that section has no contents\n"), + section->name); return TRUE; } else if (section->size < size) { fprintf (file, - _("\nError: section %s contains the debug data starting address but it is too small\n"), - section->name); + _("\nError: section %s contains the debug data starting address but it is too small\n"), + section->name); return FALSE; } @@ -2666,42 +2698,43 @@ pe_print_debugdata (bfd * abfd, void * vfile) _bfd_XXi_swap_debugdir_in (abfd, ext, &idd); if ((idd.Type) >= IMAGE_NUMBEROF_DEBUG_TYPES) - type_name = debug_type_names[0]; + type_name = debug_type_names[0]; else - type_name = debug_type_names[idd.Type]; + type_name = debug_type_names[idd.Type]; fprintf (file, " %2ld %14s %08lx %08lx %08lx\n", idd.Type, type_name, idd.SizeOfData, idd.AddressOfRawData, idd.PointerToRawData); if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW) - { - char signature[CV_INFO_SIGNATURE_LENGTH * 2 + 1]; + { + char signature[CV_INFO_SIGNATURE_LENGTH * 2 + 1]; /* PR 17512: file: 065-29434-0.001:0.1 We need to use a 32-bit aligned buffer to safely read in a codeview record. */ - char buffer[256 + 1] ATTRIBUTE_ALIGNED_ALIGNOF (CODEVIEW_INFO); + char buffer[256 + 1] ATTRIBUTE_ALIGNED_ALIGNOF (CODEVIEW_INFO); - CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer; + CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer; - /* The debug entry doesn't have to have to be in a section, + /* The debug entry doesn't have to have to be in a section, in which case AddressOfRawData is 0, so always use PointerToRawData. */ - if (!_bfd_XXi_slurp_codeview_record (abfd, (file_ptr) idd.PointerToRawData, + if (!_bfd_XXi_slurp_codeview_record (abfd, (file_ptr) idd.PointerToRawData, idd.SizeOfData, cvinfo)) - continue; + continue; - for (i = 0; i < cvinfo->SignatureLength; i++) - sprintf (&signature[i*2], "%02x", cvinfo->Signature[i] & 0xff); + for (i = 0; i < cvinfo->SignatureLength; i++) + sprintf (&signature[i*2], "%02x", cvinfo->Signature[i] & 0xff); - fprintf (file, "(format %c%c%c%c signature %s age %ld)\n", + /* xgettext:c-format */ + fprintf (file, _("(format %c%c%c%c signature %s age %ld)\n"), buffer[0], buffer[1], buffer[2], buffer[3], signature, cvinfo->Age); - } + } } if (size % sizeof (struct external_IMAGE_DEBUG_DIRECTORY) != 0) fprintf (file, - _("The debug directory size is not a multiple of the debug directory entry size\n")); + _("The debug directory size is not a multiple of the debug directory entry size\n")); return TRUE; } @@ -2773,12 +2806,13 @@ _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile) fprintf (file, "\t(%s)",name); fprintf (file, "\nMajorLinkerVersion\t%d\n", i->MajorLinkerVersion); fprintf (file, "MinorLinkerVersion\t%d\n", i->MinorLinkerVersion); - fprintf (file, "SizeOfCode\t\t%08lx\n", (unsigned long) i->SizeOfCode); - fprintf (file, "SizeOfInitializedData\t%08lx\n", - (unsigned long) i->SizeOfInitializedData); - fprintf (file, "SizeOfUninitializedData\t%08lx\n", - (unsigned long) i->SizeOfUninitializedData); - fprintf (file, "AddressOfEntryPoint\t"); + fprintf (file, "SizeOfCode\t\t"); + bfd_fprintf_vma (abfd, file, i->SizeOfCode); + fprintf (file, "\nSizeOfInitializedData\t"); + bfd_fprintf_vma (abfd, file, i->SizeOfInitializedData); + fprintf (file, "\nSizeOfUninitializedData\t"); + bfd_fprintf_vma (abfd, file, i->SizeOfUninitializedData); + fprintf (file, "\nAddressOfEntryPoint\t"); bfd_fprintf_vma (abfd, file, i->AddressOfEntryPoint); fprintf (file, "\nBaseOfCode\t\t"); bfd_fprintf_vma (abfd, file, i->BaseOfCode); @@ -2790,20 +2824,18 @@ _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile) fprintf (file, "\nImageBase\t\t"); bfd_fprintf_vma (abfd, file, i->ImageBase); - fprintf (file, "\nSectionAlignment\t"); - bfd_fprintf_vma (abfd, file, i->SectionAlignment); - fprintf (file, "\nFileAlignment\t\t"); - bfd_fprintf_vma (abfd, file, i->FileAlignment); - fprintf (file, "\nMajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion); + fprintf (file, "\nSectionAlignment\t%08x\n", i->SectionAlignment); + fprintf (file, "FileAlignment\t\t%08x\n", i->FileAlignment); + fprintf (file, "MajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion); fprintf (file, "MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion); fprintf (file, "MajorImageVersion\t%d\n", i->MajorImageVersion); fprintf (file, "MinorImageVersion\t%d\n", i->MinorImageVersion); fprintf (file, "MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion); fprintf (file, "MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion); - fprintf (file, "Win32Version\t\t%08lx\n", (unsigned long) i->Reserved1); - fprintf (file, "SizeOfImage\t\t%08lx\n", (unsigned long) i->SizeOfImage); - fprintf (file, "SizeOfHeaders\t\t%08lx\n", (unsigned long) i->SizeOfHeaders); - fprintf (file, "CheckSum\t\t%08lx\n", (unsigned long) i->CheckSum); + fprintf (file, "Win32Version\t\t%08x\n", i->Reserved1); + fprintf (file, "SizeOfImage\t\t%08x\n", i->SizeOfImage); + fprintf (file, "SizeOfHeaders\t\t%08x\n", i->SizeOfHeaders); + fprintf (file, "CheckSum\t\t%08x\n", i->CheckSum); switch (i->Subsystem) { @@ -2946,52 +2978,58 @@ _bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd) bfd_byte *data; if (section && bfd_malloc_and_get_section (obfd, section, &data)) - { - unsigned int i; - struct external_IMAGE_DEBUG_DIRECTORY *dd = + { + unsigned int i; + struct external_IMAGE_DEBUG_DIRECTORY *dd = (struct external_IMAGE_DEBUG_DIRECTORY *)(data + (addr - section->vma)); /* PR 17512: file: 0f15796a. */ - if (ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size + (addr - section->vma) - > bfd_get_section_size (section)) + if ((unsigned long) ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size + > section->size - (addr - section->vma)) { - _bfd_error_handler (_("%B: Data Directory size (%lx) exceeds space left in section (%lx)"), - obfd, ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size, - bfd_get_section_size (section) - (addr - section->vma)); + /* xgettext:c-format */ + _bfd_error_handler + (_("%pB: Data Directory size (%lx) " + "exceeds space left in section (%" PRIx64 ")"), + obfd, ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size, + (uint64_t) (section->size - (addr - section->vma))); + free (data); return FALSE; } - for (i = 0; i < ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size + for (i = 0; i < ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++) - { - asection *ddsection; - struct external_IMAGE_DEBUG_DIRECTORY *edd = &(dd[i]); - struct internal_IMAGE_DEBUG_DIRECTORY idd; + { + asection *ddsection; + struct external_IMAGE_DEBUG_DIRECTORY *edd = &(dd[i]); + struct internal_IMAGE_DEBUG_DIRECTORY idd; - _bfd_XXi_swap_debugdir_in (obfd, edd, &idd); + _bfd_XXi_swap_debugdir_in (obfd, edd, &idd); - if (idd.AddressOfRawData == 0) - continue; /* RVA 0 means only offset is valid, not handled yet. */ + if (idd.AddressOfRawData == 0) + continue; /* RVA 0 means only offset is valid, not handled yet. */ - ddsection = find_section_by_vma (obfd, idd.AddressOfRawData + ope->pe_opthdr.ImageBase); - if (!ddsection) - continue; /* Not in a section! */ + ddsection = find_section_by_vma (obfd, idd.AddressOfRawData + ope->pe_opthdr.ImageBase); + if (!ddsection) + continue; /* Not in a section! */ - idd.PointerToRawData = ddsection->filepos + (idd.AddressOfRawData + idd.PointerToRawData = ddsection->filepos + (idd.AddressOfRawData + ope->pe_opthdr.ImageBase) - ddsection->vma; - _bfd_XXi_swap_debugdir_out (obfd, &idd, edd); - } + _bfd_XXi_swap_debugdir_out (obfd, &idd, edd); + } - if (!bfd_set_section_contents (obfd, section, data, 0, section->size)) + if (!bfd_set_section_contents (obfd, section, data, 0, section->size)) { - _bfd_error_handler (_("Failed to update file offsets in debug directory")); + _bfd_error_handler (_("failed to update file offsets in debug directory")); + free (data); return FALSE; } - } + free (data); + } else if (section) { - _bfd_error_handler (_("%B: Failed to read debug data section"), obfd); + _bfd_error_handler (_("%pB: failed to read debug data section"), obfd); return FALSE; } } @@ -3070,12 +3108,12 @@ static bfd_byte * rsrc_count_directory (bfd *, bfd_byte *, bfd_byte *, bfd_byte *, bfd_vma); static bfd_byte * -rsrc_count_entries (bfd * abfd, - bfd_boolean is_name, - bfd_byte * datastart, - bfd_byte * data, - bfd_byte * dataend, - bfd_vma rva_bias) +rsrc_count_entries (bfd * abfd, + bfd_boolean is_name, + bfd_byte * datastart, + bfd_byte * data, + bfd_byte * dataend, + bfd_vma rva_bias) { unsigned long entry, addr, size; @@ -3123,11 +3161,11 @@ rsrc_count_entries (bfd * abfd, } static bfd_byte * -rsrc_count_directory (bfd * abfd, +rsrc_count_directory (bfd * abfd, bfd_byte * datastart, bfd_byte * data, bfd_byte * dataend, - bfd_vma rva_bias) + bfd_vma rva_bias) { unsigned int num_entries, num_ids; bfd_byte * highest_data = data; @@ -3159,7 +3197,7 @@ rsrc_count_directory (bfd * abfd, typedef struct rsrc_dir_chain { - unsigned int num_entries; + unsigned int num_entries; struct rsrc_entry * first_entry; struct rsrc_entry * last_entry; } rsrc_dir_chain; @@ -3179,15 +3217,15 @@ typedef struct rsrc_directory typedef struct rsrc_string { - unsigned int len; - bfd_byte * string; + unsigned int len; + bfd_byte * string; } rsrc_string; typedef struct rsrc_leaf { - unsigned int size; - unsigned int codepage; - bfd_byte * data; + unsigned int size; + unsigned int codepage; + bfd_byte * data; } rsrc_leaf; typedef struct rsrc_entry @@ -3195,18 +3233,18 @@ typedef struct rsrc_entry bfd_boolean is_name; union { - unsigned int id; - struct rsrc_string name; + unsigned int id; + struct rsrc_string name; } name_id; bfd_boolean is_dir; union { struct rsrc_directory * directory; - struct rsrc_leaf * leaf; + struct rsrc_leaf * leaf; } value; - struct rsrc_entry * next_entry; + struct rsrc_entry * next_entry; struct rsrc_directory * parent; } rsrc_entry; @@ -3215,13 +3253,13 @@ rsrc_parse_directory (bfd *, rsrc_directory *, bfd_byte *, bfd_byte *, bfd_byte *, bfd_vma, rsrc_entry *); static bfd_byte * -rsrc_parse_entry (bfd * abfd, - bfd_boolean is_name, - rsrc_entry * entry, - bfd_byte * datastart, - bfd_byte * data, - bfd_byte * dataend, - bfd_vma rva_bias, +rsrc_parse_entry (bfd * abfd, + bfd_boolean is_name, + rsrc_entry * entry, + bfd_byte * datastart, + bfd_byte * data, + bfd_byte * dataend, + bfd_vma rva_bias, rsrc_directory * parent) { unsigned long val, addr, size; @@ -3293,14 +3331,14 @@ rsrc_parse_entry (bfd * abfd, } static bfd_byte * -rsrc_parse_entries (bfd * abfd, +rsrc_parse_entries (bfd * abfd, rsrc_dir_chain * chain, - bfd_boolean is_name, - bfd_byte * highest_data, - bfd_byte * datastart, - bfd_byte * data, - bfd_byte * dataend, - bfd_vma rva_bias, + bfd_boolean is_name, + bfd_byte * highest_data, + bfd_byte * datastart, + bfd_byte * data, + bfd_byte * dataend, + bfd_vma rva_bias, rsrc_directory * parent) { unsigned int i; @@ -3346,12 +3384,12 @@ rsrc_parse_entries (bfd * abfd, } static bfd_byte * -rsrc_parse_directory (bfd * abfd, +rsrc_parse_directory (bfd * abfd, rsrc_directory * table, bfd_byte * datastart, bfd_byte * data, bfd_byte * dataend, - bfd_vma rva_bias, + bfd_vma rva_bias, rsrc_entry * entry) { bfd_byte * highest_data = data; @@ -3402,14 +3440,14 @@ rsrc_write_string (rsrc_write_data * data, static inline unsigned int rsrc_compute_rva (rsrc_write_data * data, - bfd_byte * addr) + bfd_byte * addr) { return (addr - data->datastart) + data->rva_bias; } static void rsrc_write_leaf (rsrc_write_data * data, - rsrc_leaf * leaf) + rsrc_leaf * leaf) { bfd_put_32 (data->abfd, rsrc_compute_rva (data, data->next_data), data->next_leaf); @@ -3428,8 +3466,8 @@ static void rsrc_write_directory (rsrc_write_data *, rsrc_directory *); static void rsrc_write_entry (rsrc_write_data * data, - bfd_byte * where, - rsrc_entry * entry) + bfd_byte * where, + rsrc_entry * entry) { if (entry->is_name) { @@ -3557,19 +3595,19 @@ u16_mbtouc (wchar_t * puc, const unsigned short * s, unsigned int n) if (c < 0xdc00) { if (n >= 2) - { - if (s[1] >= 0xdc00 && s[1] < 0xe000) - { - *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00); - return 2; - } - } + { + if (s[1] >= 0xdc00 && s[1] < 0xe000) + { + *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00); + return 2; + } + } else - { - /* Incomplete multibyte character. */ - *puc = 0xfffd; - return n; - } + { + /* Incomplete multibyte character. */ + *puc = 0xfffd; + return n; + } } /* Invalid multibyte character. */ @@ -3694,7 +3732,7 @@ rsrc_resource_name (rsrc_entry * entry, rsrc_directory * dir) case 1: strcat (buffer, " (CURSOR)"); break; case 2: strcat (buffer, " (BITMAP)"); break; case 3: strcat (buffer, " (ICON)"); break; - case 4: strcat (buffer, " (MENU)"); break; + case 4: strcat (buffer, " (MENU)"); break; case 5: strcat (buffer, " (DIALOG)"); break; case 6: strcat (buffer, " (STRING)"); is_string = TRUE; break; case 7: strcat (buffer, " (FONTDIR)"); break; @@ -3806,7 +3844,7 @@ rsrc_merge_string_entries (rsrc_entry * a ATTRIBUTE_UNUSED, { if (a->parent != NULL && a->parent->entry != NULL - && a->parent->entry->is_name == FALSE) + && !a->parent->entry->is_name) _bfd_error_handler (_(".rsrc merge failure: duplicate string resource: %d"), ((a->parent->entry->name_id.id - 1) << 4) + i); return FALSE; @@ -3914,22 +3952,22 @@ rsrc_sort_entries (rsrc_dir_chain * chain, There should only ever be one non-zero lang manifest - if there are more it is an error. A non-zero lang manifest takes precedence over a default manifest. */ - if (entry->is_name == FALSE + if (!entry->is_name && entry->name_id.id == 1 && dir != NULL && dir->entry != NULL - && dir->entry->is_name == FALSE + && !dir->entry->is_name && dir->entry->name_id.id == 0x18) { if (next->value.directory->names.num_entries == 0 && next->value.directory->ids.num_entries == 1 - && next->value.directory->ids.first_entry->is_name == FALSE + && !next->value.directory->ids.first_entry->is_name && next->value.directory->ids.first_entry->name_id.id == 0) /* Fall through so that NEXT is dropped. */ ; else if (entry->value.directory->names.num_entries == 0 && entry->value.directory->ids.num_entries == 1 - && entry->value.directory->ids.first_entry->is_name == FALSE + && !entry->value.directory->ids.first_entry->is_name && entry->value.directory->ids.first_entry->name_id.id == 0) { /* Swap ENTRY and NEXT. Then fall through so that the old ENTRY is dropped. */ @@ -3970,22 +4008,22 @@ rsrc_sort_entries (rsrc_dir_chain * chain, message - because there should never be duplicates. The exception is Type 18/Name 1/Lang 0 which is the defaul manifest - this can just be dropped. */ - if (entry->is_name == FALSE + if (!entry->is_name && entry->name_id.id == 0 && dir != NULL && dir->entry != NULL - && dir->entry->is_name == FALSE + && !dir->entry->is_name && dir->entry->name_id.id == 1 && dir->entry->parent != NULL && dir->entry->parent->entry != NULL - && dir->entry->parent->entry->is_name == FALSE + && !dir->entry->parent->entry->is_name && dir->entry->parent->entry->name_id.id == 0x18 /* RT_MANIFEST */) ; else if (dir != NULL && dir->entry != NULL && dir->entry->parent != NULL && dir->entry->parent->entry != NULL - && dir->entry->parent->entry->is_name == FALSE + && !dir->entry->parent->entry->is_name && dir->entry->parent->entry->name_id.id == 0x6 /* RT_STRING */) { /* Strings need special handling. */ @@ -4070,14 +4108,14 @@ rsrc_merge (struct rsrc_entry * a, struct rsrc_entry * b) if (adir->characteristics != bdir->characteristics) { - _bfd_error_handler (_(".rsrc merge failure: dirs with differing characteristics\n")); + _bfd_error_handler (_(".rsrc merge failure: dirs with differing characteristics")); bfd_set_error (bfd_error_file_truncated); return; } if (adir->major != bdir->major || adir->minor != bdir->minor) { - _bfd_error_handler (_(".rsrc merge failure: differing directory versions\n")); + _bfd_error_handler (_(".rsrc merge failure: differing directory versions")); bfd_set_error (bfd_error_file_truncated); return; } @@ -4102,22 +4140,22 @@ rsrc_process_section (bfd * abfd, struct coff_final_link_info * pfinfo) { rsrc_directory new_table; - bfd_size_type size; - asection * sec; + bfd_size_type size; + asection * sec; pe_data_type * pe; - bfd_vma rva_bias; - bfd_byte * data; - bfd_byte * datastart; - bfd_byte * dataend; - bfd_byte * new_data; - unsigned int num_resource_sets; + bfd_vma rva_bias; + bfd_byte * data; + bfd_byte * datastart; + bfd_byte * dataend; + bfd_byte * new_data; + unsigned int num_resource_sets; rsrc_directory * type_tables; rsrc_write_data write_data; - unsigned int indx; - bfd * input; - unsigned int num_input_rsrc = 0; - unsigned int max_num_input_rsrc = 4; - ptrdiff_t * rsrc_sizes = NULL; + unsigned int indx; + bfd * input; + unsigned int num_input_rsrc = 0; + unsigned int max_num_input_rsrc = 4; + ptrdiff_t * rsrc_sizes = NULL; new_table.names.num_entries = 0; new_table.ids.num_entries = 0; @@ -4194,16 +4232,16 @@ rsrc_process_section (bfd * abfd, if (data > dataend) { /* Corrupted .rsrc section - cannot merge. */ - _bfd_error_handler (_("%s: .rsrc merge failure: corrupt .rsrc section"), - bfd_get_filename (abfd)); + _bfd_error_handler (_("%pB: .rsrc merge failure: corrupt .rsrc section"), + abfd); bfd_set_error (bfd_error_file_truncated); goto end; } if ((data - p) > rsrc_sizes [num_resource_sets]) { - _bfd_error_handler (_("%s: .rsrc merge failure: unexpected .rsrc size"), - bfd_get_filename (abfd)); + _bfd_error_handler (_("%pB: .rsrc merge failure: unexpected .rsrc size"), + abfd); bfd_set_error (bfd_error_file_truncated); goto end; } @@ -4246,9 +4284,9 @@ rsrc_process_section (bfd * abfd, /* FIXME: Should we verify that all type tables are the same ? */ new_table.characteristics = type_tables[0].characteristics; - new_table.time = type_tables[0].time; - new_table.major = type_tables[0].major; - new_table.minor = type_tables[0].minor; + new_table.time = type_tables[0].time; + new_table.major = type_tables[0].major; + new_table.minor = type_tables[0].minor; /* Chain the NAME entries onto the table. */ new_table.names.first_entry = NULL; @@ -4282,37 +4320,19 @@ rsrc_process_section (bfd * abfd, if (new_data == NULL) goto end; - write_data.abfd = abfd; - write_data.datastart = new_data; - write_data.next_table = new_data; - write_data.next_leaf = new_data + sizeof_tables_and_entries; + write_data.abfd = abfd; + write_data.datastart = new_data; + write_data.next_table = new_data; + write_data.next_leaf = new_data + sizeof_tables_and_entries; write_data.next_string = write_data.next_leaf + sizeof_leaves; - write_data.next_data = write_data.next_string + sizeof_strings; - write_data.rva_bias = sec->vma - pe->pe_opthdr.ImageBase; + write_data.next_data = write_data.next_string + sizeof_strings; + write_data.rva_bias = sec->vma - pe->pe_opthdr.ImageBase; rsrc_write_directory (& write_data, & new_table); /* Step five: Replace the old contents with the new. - We recompute the size as we may have lost entries due to mergeing. */ - size = ((write_data.next_data - new_data) + 3) & ~ 3; - - { - int page_size; - - if (coff_data (abfd)->link_info) - { - page_size = pe_data (abfd)->pe_opthdr.FileAlignment; - - /* If no file alignment has been set, default to one. - This repairs 'ld -r' for arm-wince-pe target. */ - if (page_size == 0) - page_size = 1; - } - else - page_size = PE_DEF_FILE_ALIGNMENT; - size = (size + page_size - 1) & - page_size; - } - + We don't recompute the size as it's too late here to shrink section. + See PR ld/20193 for more details. */ bfd_set_section_contents (pfinfo->output_bfd, sec, new_data, 0, size); sec->size = sec->rawsize = size; @@ -4359,7 +4379,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) else { _bfd_error_handler - (_("%B: unable to fill in DataDictionary[1] because .idata$2 is missing"), + (_("%pB: unable to fill in DataDictionary[1] because .idata$2 is missing"), abfd); result = FALSE; } @@ -4379,13 +4399,13 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) else { _bfd_error_handler - (_("%B: unable to fill in DataDictionary[1] because .idata$4 is missing"), + (_("%pB: unable to fill in DataDictionary[1] because .idata$4 is missing"), abfd); result = FALSE; } /* The import address table. This is the size/address of - .idata$5. */ + .idata$5. */ h1 = coff_link_hash_lookup (coff_hash_table (info), ".idata$5", FALSE, FALSE, TRUE); if (h1 != NULL @@ -4400,7 +4420,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) else { _bfd_error_handler - (_("%B: unable to fill in DataDictionary[12] because .idata$5 is missing"), + (_("%pB: unable to fill in DataDictionary[12] because .idata$5 is missing"), abfd); result = FALSE; } @@ -4420,7 +4440,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) else { _bfd_error_handler - (_("%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing"), + (_("%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing"), abfd); result = FALSE; } @@ -4462,11 +4482,11 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) else { _bfd_error_handler - (_("%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE(12)]" + (_("%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE(12)]" " because .idata$6 is missing"), abfd); result = FALSE; } - } + } } h1 = coff_link_hash_lookup (coff_hash_table (info), @@ -4487,7 +4507,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) else { _bfd_error_handler - (_("%B: unable to fill in DataDictionary[9] because __tls_used is missing"), + (_("%pB: unable to fill in DataDictionary[9] because __tls_used is missing"), abfd); result = FALSE; }