X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=bfd%2FpeXXigen.c;h=50e4face50c8f5aa9c00ed7c35e937696d605ec2;hb=a55939ca586b81c16cc95fa692a7862551cc6773;hp=b3706723c83c8cec600c144b807de17245ecc8bc;hpb=012d44268695f1c5d4e2e019c610c8b99bd7e553;p=binutils-gdb.git diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c index b3706723c83..50e4face50c 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-2021 Free Software Foundation, Inc. + Copyright (C) 1995-2022 Free Software Foundation, Inc. Written by Cygnus Solutions. This file is part of BFD, the Binary File Descriptor library. @@ -60,8 +60,9 @@ on this code has a chance of getting something accomplished without wasting too much time. */ -/* This expands into COFF_WITH_pe, COFF_WITH_pep, or COFF_WITH_pex64 - depending on whether we're compiling for straight PE or PE+. */ +/* This expands into COFF_WITH_pe, COFF_WITH_pep, COFF_WITH_pex64 or + COFF_WITH_peAArch64 depending on whether we're compiling for straight + PE or PE+. */ #define COFF_WITH_XX #include "sysdep.h" @@ -70,12 +71,8 @@ #include "coff/internal.h" #include "bfdver.h" #include "libiberty.h" -#ifdef HAVE_WCHAR_H #include -#endif -#ifdef HAVE_WCTYPE_H #include -#endif /* NOTE: it's strange to be including an architecture specific header in what's supposed to be general (to PE/PEI) code. However, that's @@ -87,6 +84,8 @@ # include "coff/x86_64.h" #elif defined COFF_WITH_pep # include "coff/ia64.h" +#elif defined COFF_WITH_peAArch64 +# include "coff/aarch64.h" #else # include "coff/i386.h" #endif @@ -96,7 +95,7 @@ #include "libpei.h" #include "safe-ctype.h" -#if defined COFF_WITH_pep || defined COFF_WITH_pex64 +#if defined COFF_WITH_pep || defined COFF_WITH_pex64 || defined COFF_WITH_peAArch64 # undef AOUTSZ # define AOUTSZ PEPAOUTSZ # define PEAOUTHDR PEPAOUTHDR @@ -218,7 +217,7 @@ _bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1) #endif } -static bfd_boolean +static bool abs_finder (bfd * abfd ATTRIBUTE_UNUSED, asection * sec, void * data) { bfd_vma abs_val = * (bfd_vma *) data; @@ -302,11 +301,11 @@ _bfd_XXi_swap_aux_in (bfd * abfd, case C_FILE: if (ext->x_file.x_fname[0] == 0) { - in->x_file.x_n.x_zeroes = 0; - in->x_file.x_n.x_offset = H_GET_32 (abfd, ext->x_file.x_n.x_offset); + in->x_file.x_n.x_n.x_zeroes = 0; + in->x_file.x_n.x_n.x_offset = H_GET_32 (abfd, ext->x_file.x_n.x_offset); } else - memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN); + memcpy (in->x_file.x_n.x_fname, ext->x_file.x_fname, FILNMLEN); return; case C_STAT: @@ -374,13 +373,13 @@ _bfd_XXi_swap_aux_out (bfd * abfd, switch (in_class) { case C_FILE: - if (in->x_file.x_fname[0] == 0) + if (in->x_file.x_n.x_fname[0] == 0) { H_PUT_32 (abfd, 0, ext->x_file.x_n.x_zeroes); - H_PUT_32 (abfd, in->x_file.x_n.x_offset, ext->x_file.x_n.x_offset); + H_PUT_32 (abfd, in->x_file.x_n.x_n.x_offset, ext->x_file.x_n.x_offset); } else - memcpy (ext->x_file.x_fname, in->x_file.x_fname, sizeof (ext->x_file.x_fname)); + memcpy (ext->x_file.x_fname, in->x_file.x_n.x_fname, sizeof (ext->x_file.x_fname)); return AUXESZ; @@ -473,7 +472,7 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd, aouthdr_int->text_start = GET_AOUTHDR_TEXT_START (abfd, aouthdr_ext->text_start); -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) /* PE32+ does not have data_start member! */ aouthdr_int->data_start = GET_AOUTHDR_DATA_START (abfd, aouthdr_ext->data_start); @@ -559,7 +558,7 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd, if (aouthdr_int->entry) { aouthdr_int->entry += a->ImageBase; -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) aouthdr_int->entry &= 0xffffffff; #endif } @@ -567,12 +566,12 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd, if (aouthdr_int->tsize) { aouthdr_int->text_start += a->ImageBase; -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) aouthdr_int->text_start &= 0xffffffff; #endif } -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) /* PE32+ does not have data_start member! */ if (aouthdr_int->dsize) { @@ -632,7 +631,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out) if (aouthdr_in->tsize) { aouthdr_in->text_start -= ib; -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) aouthdr_in->text_start &= 0xffffffff; #endif } @@ -640,7 +639,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out) if (aouthdr_in->dsize) { aouthdr_in->data_start -= ib; -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) aouthdr_in->data_start &= 0xffffffff; #endif } @@ -648,7 +647,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out) if (aouthdr_in->entry) { aouthdr_in->entry -= ib; -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) aouthdr_in->entry &= 0xffffffff; #endif } @@ -752,7 +751,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out) PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start, aouthdr_out->standard.text_start); -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) /* PE32+ does not have data_start member! */ PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start, aouthdr_out->standard.data_start); @@ -935,10 +934,10 @@ _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out) ss = scnhdr_int->s_vaddr - pe_data (abfd)->pe_opthdr.ImageBase; if (scnhdr_int->s_vaddr < pe_data (abfd)->pe_opthdr.ImageBase) - _bfd_error_handler ("%pB:%.8s: section below image base", + _bfd_error_handler (_("%pB:%.8s: section below image base"), abfd, scnhdr_int->s_name); else if(ss != (ss & 0xffffffff)) - _bfd_error_handler ("%pB:%.8s: RVA truncated", abfd, scnhdr_int->s_name); + _bfd_error_handler (_("%pB:%.8s: RVA truncated"), abfd, scnhdr_int->s_name); PUT_SCNHDR_VADDR (abfd, ss & 0xffffffff, scnhdr_ext->s_vaddr); /* NT wants the size data to be rounded up to the next @@ -1237,7 +1236,7 @@ static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] = N_("Reserved") }; -static bfd_boolean +static bool pe_print_idata (bfd * abfd, void * vfile) { FILE *file = (FILE *) vfile; @@ -1261,12 +1260,12 @@ pe_print_idata (bfd * abfd, void * vfile) /* Maybe the extra header isn't there. Look for the section. */ section = bfd_get_section_by_name (abfd, ".idata"); if (section == NULL) - return TRUE; + return true; addr = section->vma; datasize = section->size; if (datasize == 0) - return TRUE; + return true; } else { @@ -1282,14 +1281,14 @@ pe_print_idata (bfd * abfd, void * vfile) { fprintf (file, _("\nThere is an import table, but the section containing it could not be found\n")); - return TRUE; + 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; + return true; } } @@ -1311,7 +1310,7 @@ pe_print_idata (bfd * abfd, void * vfile) if (!bfd_malloc_and_get_section (abfd, section, &data)) { free (data); - return FALSE; + return false; } adj = section->vma - extra->ImageBase; @@ -1510,10 +1509,10 @@ pe_print_idata (bfd * abfd, void * vfile) free (data); - return TRUE; + return true; } -static bfd_boolean +static bool pe_print_edata (bfd * abfd, void * vfile) { FILE *file = (FILE *) vfile; @@ -1550,13 +1549,13 @@ pe_print_edata (bfd * abfd, void * vfile) /* Maybe the extra header isn't there. Look for the section. */ section = bfd_get_section_by_name (abfd, ".edata"); if (section == NULL) - return TRUE; + return true; addr = section->vma; dataoff = 0; datasize = section->size; if (datasize == 0) - return TRUE; + return true; } else { @@ -1570,14 +1569,14 @@ pe_print_edata (bfd * abfd, void * vfile) { fprintf (file, _("\nThere is an export table, but the section containing it could not be found\n")); - return TRUE; + 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; + return true; } dataoff = addr - section->vma; @@ -1588,7 +1587,7 @@ pe_print_edata (bfd * abfd, void * vfile) fprintf (file, _("\nThere is an export table in %s, but it does not fit into that section\n"), section->name); - return TRUE; + return true; } } @@ -1599,7 +1598,7 @@ pe_print_edata (bfd * abfd, void * vfile) /* xgettext:c-format */ _("\nThere is an export table in %s, but it is too small (%d)\n"), section->name, (int) datasize); - return TRUE; + return true; } /* xgettext:c-format */ @@ -1608,11 +1607,11 @@ pe_print_edata (bfd * abfd, void * vfile) data = (bfd_byte *) bfd_malloc (datasize); if (data == NULL) - return FALSE; + return false; if (! bfd_get_section_contents (abfd, section, data, (file_ptr) dataoff, datasize)) - return FALSE; + return false; /* Go get Export Directory Table. */ edt.export_flags = bfd_get_32 (abfd, data + 0); @@ -1786,7 +1785,7 @@ pe_print_edata (bfd * abfd, void * vfile) free (data); - return TRUE; + return true; } /* This really is architecture dependent. On IA-64, a .pdata entry @@ -1801,10 +1800,10 @@ pe_print_edata (bfd * abfd, void * vfile) This is the version for uncompressed data. */ -static bfd_boolean +static bool pe_print_pdata (bfd * abfd, void * vfile) { -#if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) +#if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) # define PDATA_ROW_SIZE (3 * 8) #else # define PDATA_ROW_SIZE (5 * 4) @@ -1820,7 +1819,7 @@ pe_print_pdata (bfd * abfd, void * vfile) if (section == NULL || coff_section_data (abfd, section) == NULL || pei_section_data (abfd, section) == NULL) - return TRUE; + return true; stop = pei_section_data (abfd, section)->virt_size; if ((stop % onaline) != 0) @@ -1831,7 +1830,7 @@ pe_print_pdata (bfd * abfd, void * vfile) fprintf (file, _("\nThe Function Table (interpreted .pdata section contents)\n")); -#if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) +#if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) fprintf (file, _(" vma:\t\t\tBegin Address End Address Unwind Info\n")); #else @@ -1842,7 +1841,7 @@ pe_print_pdata (bfd * abfd, void * vfile) datasize = section->size; if (datasize == 0) - return TRUE; + return true; /* PR 17512: file: 002-193900-0.004. */ if (datasize < stop) @@ -1850,13 +1849,13 @@ pe_print_pdata (bfd * abfd, void * vfile) /* xgettext:c-format */ fprintf (file, _("Virtual size of .pdata section (%ld) larger than real size (%ld)\n"), (long) stop, (long) datasize); - return FALSE; + return false; } if (! bfd_malloc_and_get_section (abfd, section, &data)) { free (data); - return FALSE; + return false; } start = 0; @@ -1868,7 +1867,7 @@ pe_print_pdata (bfd * abfd, void * vfile) bfd_vma eh_handler; bfd_vma eh_data; bfd_vma prolog_end_addr; -#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) int em_data; #endif @@ -1886,7 +1885,7 @@ pe_print_pdata (bfd * abfd, void * vfile) /* We are probably into the padding of the section now. */ break; -#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) em_data = ((eh_handler & 0x1) << 2) | (prolog_end_addr & 0x3); #endif eh_handler &= ~(bfd_vma) 0x3; @@ -1897,7 +1896,7 @@ pe_print_pdata (bfd * abfd, void * vfile) bfd_fprintf_vma (abfd, file, begin_addr); fputc (' ', file); bfd_fprintf_vma (abfd, file, end_addr); fputc (' ', file); bfd_fprintf_vma (abfd, file, eh_handler); -#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) fputc (' ', file); bfd_fprintf_vma (abfd, file, eh_data); fputc (' ', file); bfd_fprintf_vma (abfd, file, prolog_end_addr); @@ -1908,7 +1907,7 @@ pe_print_pdata (bfd * abfd, void * vfile) free (data); - return TRUE; + return true; #undef PDATA_ROW_SIZE } @@ -1973,7 +1972,7 @@ cleanup_syms (sym_cache *psc) /* This is the version for "compressed" pdata. */ -bfd_boolean +bool _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile) { # define PDATA_ROW_SIZE (2 * 4) @@ -1989,7 +1988,7 @@ _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile) if (section == NULL || coff_section_data (abfd, section) == NULL || pei_section_data (abfd, section) == NULL) - return TRUE; + return true; stop = pei_section_data (abfd, section)->virt_size; if ((stop % onaline) != 0) @@ -2007,12 +2006,12 @@ _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile) datasize = section->size; if (datasize == 0) - return TRUE; + return true; if (! bfd_malloc_and_get_section (abfd, section, &data)) { free (data); - return FALSE; + return false; } start = 0; @@ -2087,7 +2086,7 @@ _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile) cleanup_syms (& cache); - return TRUE; + return true; #undef PDATA_ROW_SIZE } @@ -2110,7 +2109,7 @@ static const char * const tbl[] = "UNKNOWN", /* MUST be last. */ }; -static bfd_boolean +static bool pe_print_reloc (bfd * abfd, void * vfile) { FILE *file = (FILE *) vfile; @@ -2119,7 +2118,7 @@ pe_print_reloc (bfd * abfd, void * vfile) bfd_byte *p, *end; if (section == NULL || section->size == 0 || !(section->flags & SEC_HAS_CONTENTS)) - return TRUE; + return true; fprintf (file, _("\n\nPE File Base Relocations (interpreted .reloc section contents)\n")); @@ -2127,7 +2126,7 @@ pe_print_reloc (bfd * abfd, void * vfile) if (! bfd_malloc_and_get_section (abfd, section, &data)) { free (data); - return FALSE; + return false; } p = data; @@ -2190,7 +2189,7 @@ pe_print_reloc (bfd * abfd, void * vfile) free (data); - return TRUE; + return true; } /* A data structure describing the regions of a .rsrc section. @@ -2215,13 +2214,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, - unsigned int indent, - bfd_boolean is_name, - bfd_byte * data, - rsrc_regions * regions, - bfd_vma rva_bias) +rsrc_print_resource_entries (FILE *file, + bfd *abfd, + unsigned int indent, + bool is_name, + bfd_byte *data, + rsrc_regions *regions, + bfd_vma rva_bias) { unsigned long entry, addr, size; bfd_byte * leaf; @@ -2377,7 +2376,7 @@ rsrc_print_resource_directory (FILE * file, { bfd_byte * entry_end; - entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, TRUE, + entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, true, data, regions, rva_bias); data += 8; highest_data = max (highest_data, entry_end); @@ -2389,7 +2388,7 @@ rsrc_print_resource_directory (FILE * file, { bfd_byte * entry_end; - entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, FALSE, + entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, false, data, regions, rva_bias); data += 8; highest_data = max (highest_data, entry_end); @@ -2404,7 +2403,7 @@ rsrc_print_resource_directory (FILE * file, reproduce the resources, windres does that. Instead we dump the tables in a human readable format. */ -static bfd_boolean +static bool rsrc_print_section (bfd * abfd, void * vfile) { bfd_vma rva_bias; @@ -2417,24 +2416,24 @@ rsrc_print_section (bfd * abfd, void * vfile) pe = pe_data (abfd); if (pe == NULL) - return TRUE; + return true; section = bfd_get_section_by_name (abfd, ".rsrc"); if (section == NULL) - return TRUE; + return true; if (!(section->flags & SEC_HAS_CONTENTS)) - return TRUE; + return true; datasize = section->size; if (datasize == 0) - return TRUE; + return true; rva_bias = section->vma - pe->pe_opthdr.ImageBase; if (! bfd_malloc_and_get_section (abfd, section, & data)) { free (data); - return FALSE; + return false; } regions.section_start = data; @@ -2489,7 +2488,7 @@ rsrc_print_section (bfd * abfd, void * vfile) (int) (regions.resource_start - regions.section_start)); free (regions.section_start); - return TRUE; + return true; } #define IMAGE_NUMBEROF_DEBUG_TYPES 17 @@ -2515,7 +2514,7 @@ static char * debug_type_names[IMAGE_NUMBEROF_DEBUG_TYPES] = "Repro", }; -static bfd_boolean +static bool pe_print_debugdata (bfd * abfd, void * vfile) { FILE *file = (FILE *) vfile; @@ -2530,7 +2529,7 @@ pe_print_debugdata (bfd * abfd, void * vfile) bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size; if (size == 0) - return TRUE; + return true; addr += extra->ImageBase; for (section = abfd->sections; section != NULL; section = section->next) @@ -2543,21 +2542,21 @@ pe_print_debugdata (bfd * abfd, void * vfile) { fprintf (file, _("\nThere is a debug directory, but the section containing it could not be found\n")); - return TRUE; + 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); - return TRUE; + 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); - return FALSE; + return false; } fprintf (file, _("\nThere is a debug directory in %s at 0x%lx\n\n"), @@ -2568,7 +2567,7 @@ pe_print_debugdata (bfd * abfd, void * vfile) if (size > (section->size - dataoff)) { fprintf (file, _("The debug data size field in the data directory is too big for the section")); - return FALSE; + return false; } fprintf (file, @@ -2578,7 +2577,7 @@ pe_print_debugdata (bfd * abfd, void * vfile) if (!bfd_malloc_and_get_section (abfd, section, &data)) { free (data); - return FALSE; + return false; } for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++) @@ -2631,10 +2630,10 @@ pe_print_debugdata (bfd * abfd, void * vfile) fprintf (file, _("The debug directory size is not a multiple of the debug directory entry size\n")); - return TRUE; + return true; } -static bfd_boolean +static bool pe_is_repro (bfd * abfd) { pe_data_type *pe = pe_data (abfd); @@ -2643,13 +2642,13 @@ pe_is_repro (bfd * abfd) bfd_byte *data = 0; bfd_size_type dataoff; unsigned int i; - bfd_boolean res = FALSE; + bool res = false; bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress; bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size; if (size == 0) - return FALSE; + return false; addr += extra->ImageBase; for (section = abfd->sections; section != NULL; section = section->next) @@ -2662,20 +2661,20 @@ pe_is_repro (bfd * abfd) || (!(section->flags & SEC_HAS_CONTENTS)) || (section->size < size)) { - return FALSE; + return false; } dataoff = addr - section->vma; if (size > (section->size - dataoff)) { - return FALSE; + return false; } if (!bfd_malloc_and_get_section (abfd, section, &data)) { free (data); - return FALSE; + return false; } for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++) @@ -2688,7 +2687,7 @@ pe_is_repro (bfd * abfd) if (idd.Type == PE_IMAGE_DEBUG_TYPE_REPRO) { - res = TRUE; + res = true; break; } } @@ -2700,7 +2699,7 @@ pe_is_repro (bfd * abfd) /* Print out the program headers. */ -bfd_boolean +bool _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile) { FILE *file = (FILE *) vfile; @@ -2724,8 +2723,11 @@ _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile) 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_REMOVABLE_RUN_FROM_SWAP, "copy to swap file if on removable media"); + PF (IMAGE_FILE_NET_RUN_FROM_SWAP, "copy to swap file if on network media"); PF (IMAGE_FILE_SYSTEM, "system file"); PF (IMAGE_FILE_DLL, "DLL"); + PF (IMAGE_FILE_UP_SYSTEM_ONLY, "run only on uniprocessor machine"); PF (IMAGE_FILE_BYTES_REVERSED_HI, "big endian"); #undef PF @@ -2785,7 +2787,7 @@ _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile) bfd_fprintf_vma (abfd, file, i->AddressOfEntryPoint); fprintf (file, "\nBaseOfCode\t\t"); bfd_fprintf_vma (abfd, file, i->BaseOfCode); -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) /* PE32+ does not have BaseOfData member! */ fprintf (file, "\nBaseOfData\t\t"); bfd_fprintf_vma (abfd, file, i->BaseOfData); @@ -2852,6 +2854,34 @@ _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile) if (subsystem_name) fprintf (file, "\t(%s)", subsystem_name); fprintf (file, "\nDllCharacteristics\t%08x\n", i->DllCharacteristics); + if (i->DllCharacteristics) + { + unsigned short dllch = i->DllCharacteristics; + const char *indent = "\t\t\t\t\t"; + + if (dllch & IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA) + fprintf (file, "%sHIGH_ENTROPY_VA\n", indent); + if (dllch & IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE) + fprintf (file, "%sDYNAMIC_BASE\n", indent); + if (dllch & IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY) + fprintf (file, "%sFORCE_INTEGRITY\n", indent); + if (dllch & IMAGE_DLL_CHARACTERISTICS_NX_COMPAT) + fprintf (file, "%sNX_COMPAT\n", indent); + if (dllch & IMAGE_DLLCHARACTERISTICS_NO_ISOLATION) + fprintf (file, "%sNO_ISOLATION\n", indent); + if (dllch & IMAGE_DLLCHARACTERISTICS_NO_SEH) + fprintf (file, "%sNO_SEH\n", indent); + if (dllch & IMAGE_DLLCHARACTERISTICS_NO_BIND) + fprintf (file, "%sNO_BIND\n", indent); + if (dllch & IMAGE_DLLCHARACTERISTICS_APPCONTAINER) + fprintf (file, "%sAPPCONTAINER\n", indent); + if (dllch & IMAGE_DLLCHARACTERISTICS_WDM_DRIVER) + fprintf (file, "%sWDM_DRIVER\n", indent); + if (dllch & IMAGE_DLLCHARACTERISTICS_GUARD_CF) + fprintf (file, "%sGUARD_CF\n", indent); + if (dllch & IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE) + fprintf (file, "%sTERMINAL_SERVICE_AWARE\n", indent); + } fprintf (file, "SizeOfStackReserve\t"); bfd_fprintf_vma (abfd, file, i->SizeOfStackReserve); fprintf (file, "\nSizeOfStackCommit\t"); @@ -2884,10 +2914,10 @@ _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile) rsrc_print_section (abfd, vfile); - return TRUE; + return true; } -static bfd_boolean +static bool is_vma_in_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sect, void *obj) { bfd_vma addr = * (bfd_vma *) obj; @@ -2903,15 +2933,16 @@ find_section_by_vma (bfd *abfd, bfd_vma addr) /* Copy any private info we understand from the input bfd to the output bfd. */ -bfd_boolean +bool _bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd) { pe_data_type *ipe, *ope; + bfd_size_type size; /* One day we may try to grok other private data. */ if (ibfd->xvec->flavour != bfd_target_coff_flavour || obfd->xvec->flavour != bfd_target_coff_flavour) - return TRUE; + return true; ipe = pe_data (ibfd); ope = pe_data (obfd); @@ -2941,7 +2972,8 @@ _bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd) memcpy (ope->dos_message, ipe->dos_message, sizeof (ope->dos_message)); /* The file offsets contained in the debug directory need rewriting. */ - if (ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size != 0) + size = ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size; + if (size != 0) { bfd_vma addr = ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].VirtualAddress + ope->pe_opthdr.ImageBase; @@ -2950,71 +2982,83 @@ _bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd) representing s_size, not virt_size). Therefore don't look for the section containing the first byte, but for that covering the last one. */ - bfd_vma last = addr + ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size - 1; + bfd_vma last = addr + size - 1; asection *section = find_section_by_vma (obfd, last); - bfd_byte *data; - /* PR 17512: file: 0f15796a. */ - if (section && addr < section->vma) + if (section != NULL) { - /* xgettext:c-format */ - _bfd_error_handler - (_("%pB: Data Directory (%lx bytes at %" PRIx64 ") " - "extends across section boundary at %" PRIx64), - obfd, ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size, - (uint64_t) addr, (uint64_t) section->vma); - return FALSE; - } + bfd_byte *data; + bfd_vma dataoff = addr - section->vma; - if (section && bfd_malloc_and_get_section (obfd, section, &data)) - { - unsigned int i; - struct external_IMAGE_DEBUG_DIRECTORY *dd = - (struct external_IMAGE_DEBUG_DIRECTORY *)(data + (addr - section->vma)); + /* PR 17512: file: 0f15796a. */ + if (addr < section->vma + || section->size < dataoff + || section->size - dataoff < size) + { + /* xgettext:c-format */ + _bfd_error_handler + (_("%pB: Data Directory (%lx bytes at %" PRIx64 ") " + "extends across section boundary at %" PRIx64), + obfd, ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size, + (uint64_t) addr, (uint64_t) section->vma); + return false; + } - for (i = 0; i < ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size - / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++) + if (bfd_malloc_and_get_section (obfd, section, &data)) { - asection *ddsection; - struct external_IMAGE_DEBUG_DIRECTORY *edd = &(dd[i]); - struct internal_IMAGE_DEBUG_DIRECTORY idd; + unsigned int i; + struct external_IMAGE_DEBUG_DIRECTORY *dd = + (struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff); - _bfd_XXi_swap_debugdir_in (obfd, edd, &idd); + 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; + bfd_vma idd_vma; - if (idd.AddressOfRawData == 0) - continue; /* RVA 0 means only offset is valid, not handled yet. */ + _bfd_XXi_swap_debugdir_in (obfd, edd, &idd); - ddsection = find_section_by_vma (obfd, idd.AddressOfRawData + ope->pe_opthdr.ImageBase); - if (!ddsection) - continue; /* Not in a section! */ + /* RVA 0 means only offset is valid, not handled yet. */ + if (idd.AddressOfRawData == 0) + continue; - idd.PointerToRawData = ddsection->filepos + (idd.AddressOfRawData - + ope->pe_opthdr.ImageBase) - ddsection->vma; + idd_vma = idd.AddressOfRawData + ope->pe_opthdr.ImageBase; + ddsection = find_section_by_vma (obfd, idd_vma); + if (!ddsection) + continue; /* Not in a section! */ - _bfd_XXi_swap_debugdir_out (obfd, &idd, edd); - } + idd.PointerToRawData + = ddsection->filepos + idd_vma - ddsection->vma; + _bfd_XXi_swap_debugdir_out (obfd, &idd, edd); + } - if (!bfd_set_section_contents (obfd, section, data, 0, section->size)) - { - _bfd_error_handler (_("failed to update file offsets in debug directory")); + if (!bfd_set_section_contents (obfd, section, data, 0, + section->size)) + { + _bfd_error_handler (_("failed to update file offsets" + " in debug directory")); + free (data); + return false; + } free (data); - return FALSE; } - free (data); - } - else if (section) - { - _bfd_error_handler (_("%pB: failed to read debug data section"), obfd); - return FALSE; + else + { + _bfd_error_handler (_("%pB: failed to read " + "debug data section"), obfd); + return false; + } } } - return TRUE; + return true; } /* Copy private section data. */ -bfd_boolean +bool _bfd_XX_bfd_copy_private_section_data (bfd *ibfd, asection *isec, bfd *obfd, @@ -3022,7 +3066,7 @@ _bfd_XX_bfd_copy_private_section_data (bfd *ibfd, { if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour || bfd_get_flavour (obfd) != bfd_target_coff_flavour) - return TRUE; + return true; if (coff_section_data (ibfd, isec) != NULL && pei_section_data (ibfd, isec) != NULL) @@ -3032,7 +3076,7 @@ _bfd_XX_bfd_copy_private_section_data (bfd *ibfd, size_t amt = sizeof (struct coff_section_tdata); osec->used_by_bfd = bfd_zalloc (obfd, amt); if (osec->used_by_bfd == NULL) - return FALSE; + return false; } if (pei_section_data (obfd, osec) == NULL) @@ -3040,7 +3084,7 @@ _bfd_XX_bfd_copy_private_section_data (bfd *ibfd, size_t amt = sizeof (struct pei_section_tdata); coff_section_data (obfd, osec)->tdata = bfd_zalloc (obfd, amt); if (coff_section_data (obfd, osec)->tdata == NULL) - return FALSE; + return false; } pei_section_data (obfd, osec)->virt_size = @@ -3049,7 +3093,7 @@ _bfd_XX_bfd_copy_private_section_data (bfd *ibfd, pei_section_data (ibfd, isec)->pe_flags; } - return TRUE; + return true; } void @@ -3058,7 +3102,7 @@ _bfd_XX_get_symbol_info (bfd * abfd, asymbol *symbol, symbol_info *ret) coff_get_symbol_info (abfd, symbol, ret); } -#if !defined(COFF_WITH_pep) && defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) && (defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64)) static int sort_x64_pdata (const void *l, const void *r) { @@ -3083,12 +3127,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, + bool is_name, + bfd_byte *datastart, + bfd_byte *data, + bfd_byte *dataend, + bfd_vma rva_bias) { unsigned long entry, addr, size; @@ -3205,14 +3249,14 @@ typedef struct rsrc_leaf typedef struct rsrc_entry { - bfd_boolean is_name; + bool is_name; union { unsigned int id; struct rsrc_string name; } name_id; - bfd_boolean is_dir; + bool is_dir; union { struct rsrc_directory * directory; @@ -3228,14 +3272,14 @@ 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_directory * parent) +rsrc_parse_entry (bfd *abfd, + bool 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; @@ -3272,7 +3316,7 @@ rsrc_parse_entry (bfd * abfd, if (HighBitSet (val)) { - entry->is_dir = TRUE; + entry->is_dir = true; entry->value.directory = bfd_malloc (sizeof * entry->value.directory); if (entry->value.directory == NULL) return dataend; @@ -3283,7 +3327,7 @@ rsrc_parse_entry (bfd * abfd, dataend, rva_bias, entry); } - entry->is_dir = FALSE; + entry->is_dir = false; entry->value.leaf = bfd_malloc (sizeof * entry->value.leaf); if (entry->value.leaf == NULL) return dataend; @@ -3306,15 +3350,15 @@ rsrc_parse_entry (bfd * abfd, } static bfd_byte * -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, - rsrc_directory * parent) +rsrc_parse_entries (bfd *abfd, + rsrc_dir_chain *chain, + bool 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; rsrc_entry * entry; @@ -3382,11 +3426,11 @@ rsrc_parse_directory (bfd * abfd, data += 16; - highest_data = rsrc_parse_entries (abfd, & table->names, TRUE, data, + highest_data = rsrc_parse_entries (abfd, & table->names, true, data, datastart, data, dataend, rva_bias, table); data += table->names.num_entries * 8; - highest_data = rsrc_parse_entries (abfd, & table->ids, FALSE, highest_data, + highest_data = rsrc_parse_entries (abfd, & table->ids, false, highest_data, datastart, data, dataend, rva_bias, table); data += table->ids.num_entries * 8; @@ -3548,16 +3592,12 @@ rsrc_write_directory (rsrc_write_data * data, BFD_ASSERT (nt == next_entry); } -#if defined HAVE_WCHAR_H && ! defined __CYGWIN__ && ! defined __MINGW32__ +#if ! defined __CYGWIN__ && ! defined __MINGW32__ /* Return the length (number of units) of the first character in S, putting its 'ucs4_t' representation in *PUC. */ static unsigned int -#if defined HAVE_WCTYPE_H u16_mbtouc (wint_t * puc, const unsigned short * s, unsigned int n) -#else -u16_mbtouc (wchar_t * puc, const unsigned short * s, unsigned int n) -#endif { unsigned short c = * s; @@ -3589,11 +3629,11 @@ u16_mbtouc (wchar_t * puc, const unsigned short * s, unsigned int n) *puc = 0xfffd; return 1; } -#endif /* HAVE_WCHAR_H and not Cygwin/Mingw */ +#endif /* not Cygwin/Mingw */ /* Perform a comparison of two entries. */ static signed int -rsrc_cmp (bfd_boolean is_name, rsrc_entry * a, rsrc_entry * b) +rsrc_cmp (bool is_name, rsrc_entry * a, rsrc_entry * b) { signed int res; bfd_byte * astring; @@ -3626,20 +3666,15 @@ rsrc_cmp (bfd_boolean is_name, rsrc_entry * a, rsrc_entry * b) res = rscpcmp ((const wchar_t *) astring, (const wchar_t *) bstring, min (alen, blen)); -#elif defined HAVE_WCHAR_H +#else { unsigned int i; res = 0; for (i = min (alen, blen); i--; astring += 2, bstring += 2) { -#if defined HAVE_WCTYPE_H wint_t awc; wint_t bwc; -#else - wchar_t awc; - wchar_t bwc; -#endif /* Convert UTF-16 unicode characters into wchar_t characters so that we can then perform a case insensitive comparison. */ @@ -3649,21 +3684,14 @@ rsrc_cmp (bfd_boolean is_name, rsrc_entry * a, rsrc_entry * b) if (Alen != Blen) return Alen - Blen; -#ifdef HAVE_WCTYPE_H awc = towlower (awc); bwc = towlower (bwc); res = awc - bwc; -#else - res = wcsncasecmp (& awc, & bwc, 1); -#endif if (res) break; } } -#else - /* Do the best we can - a case sensitive, untranslated comparison. */ - res = memcmp (astring, bstring, min (alen, blen) * 2); #endif if (res == 0) @@ -3685,7 +3713,7 @@ rsrc_print_name (char * buffer, rsrc_string string) static const char * rsrc_resource_name (rsrc_entry *entry, rsrc_directory *dir, char *buffer) { - bfd_boolean is_string = FALSE; + bool is_string = false; buffer[0] = 0; @@ -3708,7 +3736,7 @@ rsrc_resource_name (rsrc_entry *entry, rsrc_directory *dir, char *buffer) case 3: strcat (buffer, " (ICON)"); break; case 4: strcat (buffer, " (MENU)"); break; case 5: strcat (buffer, " (DIALOG)"); break; - case 6: strcat (buffer, " (STRING)"); is_string = TRUE; break; + case 6: strcat (buffer, " (STRING)"); is_string = true; break; case 7: strcat (buffer, " (FONTDIR)"); break; case 8: strcat (buffer, " (FONT)"); break; case 9: strcat (buffer, " (ACCELERATOR)"); break; @@ -3772,7 +3800,7 @@ rsrc_resource_name (rsrc_entry *entry, rsrc_directory *dir, char *buffer) them and return FALSE. Otherwise we copy any strings from B into A and then return TRUE. */ -static bfd_boolean +static bool rsrc_merge_string_entries (rsrc_entry * a ATTRIBUTE_UNUSED, rsrc_entry * b ATTRIBUTE_UNUSED) { @@ -3821,11 +3849,11 @@ rsrc_merge_string_entries (rsrc_entry * a ATTRIBUTE_UNUSED, && !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; + return false; } if (copy_needed == 0) - return TRUE; + return true; /* If we reach here then A and B must both have non-colliding strings. (We never get string resources with fully empty string tables). @@ -3833,7 +3861,7 @@ rsrc_merge_string_entries (rsrc_entry * a ATTRIBUTE_UNUSED, in B's strings. */ new_data = bfd_malloc (a->value.leaf->size + copy_needed); if (new_data == NULL) - return FALSE; + return false; nstring = new_data; astring = a->value.leaf->data; @@ -3870,7 +3898,7 @@ rsrc_merge_string_entries (rsrc_entry * a ATTRIBUTE_UNUSED, a->value.leaf->data = new_data; a->value.leaf->size += copy_needed; - return TRUE; + return true; } static void rsrc_merge (rsrc_entry *, rsrc_entry *); @@ -3880,21 +3908,21 @@ static void rsrc_merge (rsrc_entry *, rsrc_entry *); with lists and we want to handle matches specially. */ static void -rsrc_sort_entries (rsrc_dir_chain * chain, - bfd_boolean is_name, - rsrc_directory * dir) +rsrc_sort_entries (rsrc_dir_chain *chain, + bool is_name, + rsrc_directory *dir) { rsrc_entry * entry; rsrc_entry * next; rsrc_entry ** points_to_entry; - bfd_boolean swapped; + bool swapped; if (chain->num_entries < 2) return; do { - swapped = FALSE; + swapped = false; points_to_entry = & chain->first_entry; entry = * points_to_entry; next = entry->next_entry; @@ -3910,7 +3938,7 @@ rsrc_sort_entries (rsrc_dir_chain * chain, * points_to_entry = next; points_to_entry = & next->next_entry; next = entry->next_entry; - swapped = TRUE; + swapped = true; } else if (cmp == 0) { @@ -3950,7 +3978,7 @@ rsrc_sort_entries (rsrc_dir_chain * chain, * points_to_entry = next; points_to_entry = & next->next_entry; next = entry->next_entry; - swapped = TRUE; + swapped = true; } else { @@ -4105,8 +4133,8 @@ rsrc_merge (struct rsrc_entry * a, struct rsrc_entry * b) rsrc_attach_chain (& adir->ids, & bdir->ids); /* Now sort A's entries. */ - rsrc_sort_entries (& adir->names, TRUE, adir); - rsrc_sort_entries (& adir->ids, FALSE, adir); + rsrc_sort_entries (& adir->names, true, adir); + rsrc_sort_entries (& adir->ids, false, adir); } /* Check the .rsrc section. If it contains multiple concatenated @@ -4273,7 +4301,7 @@ rsrc_process_section (bfd * abfd, for (indx = 0; indx < num_resource_sets; indx++) rsrc_attach_chain (& new_table.names, & type_tables[indx].names); - rsrc_sort_entries (& new_table.names, TRUE, & new_table); + rsrc_sort_entries (& new_table.names, true, & new_table); /* Chain the ID entries onto the table. */ new_table.ids.first_entry = NULL; @@ -4282,7 +4310,7 @@ rsrc_process_section (bfd * abfd, for (indx = 0; indx < num_resource_sets; indx++) rsrc_attach_chain (& new_table.ids, & type_tables[indx].ids); - rsrc_sort_entries (& new_table.ids, FALSE, & new_table); + rsrc_sort_entries (& new_table.ids, false, & new_table); /* Step four: Create new contents for the .rsrc section. */ /* Step four point one: Compute the size of each region of the .rsrc section. @@ -4324,12 +4352,12 @@ rsrc_process_section (bfd * abfd, /* Handle the .idata section and other things that need symbol table access. */ -bfd_boolean +bool _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; - bfd_boolean result = TRUE; + bool result = true; /* There are a few fields that need to be filled in now while we have symbol table access. @@ -4340,7 +4368,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) /* The import directory. This is the address of .idata$2, with size of .idata$2 + .idata$3. */ h1 = coff_link_hash_lookup (coff_hash_table (info), - ".idata$2", FALSE, FALSE, TRUE); + ".idata$2", false, false, true); if (h1 != NULL) { /* PR ld/2729: We cannot rely upon all the output sections having been @@ -4359,11 +4387,11 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) _bfd_error_handler (_("%pB: unable to fill in DataDictionary[1] because .idata$2 is missing"), abfd); - result = FALSE; + result = false; } h1 = coff_link_hash_lookup (coff_hash_table (info), - ".idata$4", FALSE, FALSE, TRUE); + ".idata$4", false, false, true); if (h1 != NULL && (h1->root.type == bfd_link_hash_defined || h1->root.type == bfd_link_hash_defweak) @@ -4379,13 +4407,13 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) _bfd_error_handler (_("%pB: unable to fill in DataDictionary[1] because .idata$4 is missing"), abfd); - result = FALSE; + result = false; } /* The import address table. This is the size/address of .idata$5. */ h1 = coff_link_hash_lookup (coff_hash_table (info), - ".idata$5", FALSE, FALSE, TRUE); + ".idata$5", false, false, true); if (h1 != NULL && (h1->root.type == bfd_link_hash_defined || h1->root.type == bfd_link_hash_defweak) @@ -4400,11 +4428,11 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) _bfd_error_handler (_("%pB: unable to fill in DataDictionary[12] because .idata$5 is missing"), abfd); - result = FALSE; + result = false; } h1 = coff_link_hash_lookup (coff_hash_table (info), - ".idata$6", FALSE, FALSE, TRUE); + ".idata$6", false, false, true); if (h1 != NULL && (h1->root.type == bfd_link_hash_defined || h1->root.type == bfd_link_hash_defweak) @@ -4420,13 +4448,13 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) _bfd_error_handler (_("%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing"), abfd); - result = FALSE; + result = false; } } else { h1 = coff_link_hash_lookup (coff_hash_table (info), - "__IAT_start__", FALSE, FALSE, TRUE); + "__IAT_start__", false, false, true); if (h1 != NULL && (h1->root.type == bfd_link_hash_defined || h1->root.type == bfd_link_hash_defweak) @@ -4441,7 +4469,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) + h1->root.u.def.section->output_offset); h1 = coff_link_hash_lookup (coff_hash_table (info), - "__IAT_end__", FALSE, FALSE, TRUE); + "__IAT_end__", false, false, true); if (h1 != NULL && (h1->root.type == bfd_link_hash_defined || h1->root.type == bfd_link_hash_defweak) @@ -4462,7 +4490,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) _bfd_error_handler (_("%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE(12)]" " because .idata$6 is missing"), abfd); - result = FALSE; + result = false; } } } @@ -4470,7 +4498,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) h1 = coff_link_hash_lookup (coff_hash_table (info), (bfd_get_symbol_leading_char (abfd) != 0 ? "__tls_used" : "_tls_used"), - FALSE, FALSE, TRUE); + false, false, true); if (h1 != NULL) { if ((h1->root.type == bfd_link_hash_defined @@ -4487,13 +4515,13 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) _bfd_error_handler (_("%pB: unable to fill in DataDictionary[9] because __tls_used is missing"), abfd); - result = FALSE; + result = false; } /* According to PECOFF sepcifications by Microsoft version 8.2 the TLS data directory consists of 4 pointers, followed by two 4-byte integer. This implies that the total size is different for 32-bit and 64-bit executables. */ -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x18; #else pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x28; @@ -4502,7 +4530,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) /* If there is a .pdata section and we have linked pdata finally, we need to sort the entries ascending. */ -#if !defined(COFF_WITH_pep) && defined(COFF_WITH_pex64) +#if !defined(COFF_WITH_pep) && (defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64)) { asection *sec = bfd_get_section_by_name (abfd, ".pdata"); @@ -4527,7 +4555,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) free (tmp_data); } else - result = FALSE; + result = false; } } #endif