/* Support for the generic parts of PE/PEI; the common executable parts.
- Copyright (C) 1995-2020 Free Software Foundation, Inc.
+ Copyright (C) 1995-2021 Free Software Foundation, Inc.
Written by Cygnus Solutions.
This file is part of BFD, the Binary File Descriptor library.
#include "coff/internal.h"
#include "bfdver.h"
#include "libiberty.h"
-#ifdef HAVE_WCHAR_H
#include <wchar.h>
-#endif
-#ifdef HAVE_WCTYPE_H
#include <wctype.h>
-#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
#define HighBitSet(val) ((val) & 0x80000000)
#define SetHighBit(val) ((val) | 0x80000000)
#define WithoutHighBit(val) ((val) & 0x7fffffff)
-
-/* FIXME: This file has various tests of POWERPC_LE_PE. Those tests
- worked when the code was in peicode.h, but no longer work now that
- 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. */
\f
void
_bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1)
in->n_sclass = C_STAT;
}
#endif
-
-#ifdef coff_swap_sym_in_hook
- /* This won't work in peigen.c, but since it's for PPC PE, it's not
- worth fixing. */
- coff_swap_sym_in_hook (abfd, ext1, in1);
-#endif
}
-static bfd_boolean
+static bool
abs_finder (bfd * abfd ATTRIBUTE_UNUSED, asection * sec, void * data)
{
bfd_vma abs_val = * (bfd_vma *) data;
H_PUT_32 (abfd, in->x_file.x_n.x_offset, ext->x_file.x_n.x_offset);
}
else
- memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
+ memcpy (ext->x_file.x_fname, in->x_file.x_fname, sizeof (ext->x_file.x_fname));
return AUXESZ;
aouthdr_int->data_start &= 0xffffffff;
}
#endif
-
-#ifdef POWERPC_LE_PE
- /* These three fields are normally set up by ppc_relocate_section.
- In the case of reading a file in, we can pick them up from the
- DataDirectory. */
- first_thunk_address = a->DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress;
- thunk_size = a->DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size;
- import_table_size = a->DataDirectory[PE_IMPORT_TABLE].Size;
-#endif
}
/* A support function for below. */
memcpy (scnhdr_ext->s_name, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
- PUT_SCNHDR_VADDR (abfd,
- ((scnhdr_int->s_vaddr
- - pe_data (abfd)->pe_opthdr.ImageBase)
- & 0xffffffff),
- scnhdr_ext->s_vaddr);
+ 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"),
+ abfd, scnhdr_int->s_name);
+ else if(ss != (ss & 0xffffffff))
+ _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
NT_FILE_ALIGNMENT, but zero if it has no content (as in .bss,
(0x02000000). Also, the resource data should also be read and
writable. */
- /* FIXME: Alignment is also encoded in this field, at least on PPC and
+ /* FIXME: Alignment is also encoded in this field, at least on
ARM-WINCE. Although - how do we get the original alignment field
back ? */
_bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo)
{
char buffer[256+1];
+ bfd_size_type nread;
if (bfd_seek (abfd, where, SEEK_SET) != 0)
return NULL;
- if (bfd_bread (buffer, 256, abfd) < 4)
+ if (length <= sizeof (CV_INFO_PDB70) && length <= sizeof (CV_INFO_PDB20))
+ return NULL;
+ if (length > 256)
+ length = 256;
+ nread = bfd_bread (buffer, length, abfd);
+ if (length != nread)
return NULL;
/* Ensure null termination of filename. */
- buffer[256] = '\0';
+ memset (buffer + nread, 0, sizeof (buffer) - nread);
cvinfo->CVSignature = H_GET_32 (abfd, buffer);
cvinfo->Age = 0;
memcpy (&(cvinfo->Signature[8]), &(cvinfo70->Signature[8]), 8);
cvinfo->SignatureLength = CV_INFO_SIGNATURE_LENGTH;
- // cvinfo->PdbFileName = cvinfo70->PdbFileName;
+ /* cvinfo->PdbFileName = cvinfo70->PdbFileName; */
return cvinfo;
}
cvinfo->Age = H_GET_32(abfd, cvinfo20->Age);
memcpy (cvinfo->Signature, cvinfo20->Signature, 4);
cvinfo->SignatureLength = 4;
- // cvinfo->PdbFileName = cvinfo20->PdbFileName;
+ /* cvinfo->PdbFileName = cvinfo20->PdbFileName; */
return cvinfo;
}
N_("Reserved")
};
-#ifdef POWERPC_LE_PE
-/* The code for the PPC really falls in the "architecture dependent"
- category. However, it's not clear that anyone will ever care, so
- we're ignoring the issue for now; if/when PPC matters, some of this
- may need to go into peicode.h, or arguments passed to enable the
- PPC- specific code. */
-#endif
-
-static bfd_boolean
+static bool
pe_print_idata (bfd * abfd, void * vfile)
{
FILE *file = (FILE *) vfile;
bfd_byte *data;
asection *section;
bfd_signed_vma adj;
-
-#ifdef POWERPC_LE_PE
- asection *rel_section = bfd_get_section_by_name (abfd, ".reldata");
-#endif
-
bfd_size_type datasize = 0;
bfd_size_type dataoff;
bfd_size_type i;
/* 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
{
{
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;
}
}
dataoff = addr - section->vma;
-#ifdef POWERPC_LE_PE
- 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
- descriptor consists of the function code starting address
- followed by the address of the toc. The starting address we
- get from the bfd, and the descriptor is supposed to be in the
- .reldata section. */
-
- bfd_vma loadable_toc_address;
- bfd_vma toc_address;
- bfd_vma start_address;
- bfd_byte *data;
- bfd_vma offset;
-
- if (!bfd_malloc_and_get_section (abfd, rel_section, &data))
- {
- free (data);
- return FALSE;
- }
-
- offset = abfd->start_address - rel_section->vma;
-
- if (offset >= rel_section->size || offset + 8 > rel_section->size)
- {
- 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;
-
- fprintf (file,
- _("\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);
- free (data);
- }
- else
- {
- fprintf (file,
- _("\nNo reldata section! Function descriptor not decoded.\n"));
- }
-#endif
-
fprintf (file,
_("\nThe Import Tables (interpreted %s section contents)\n"),
section->name);
if (!bfd_malloc_and_get_section (abfd, section, &data))
{
free (data);
- return FALSE;
+ return false;
}
adj = section->vma - extra->ImageBase;
free (data);
- return TRUE;
+ return true;
}
-static bfd_boolean
+static bool
pe_print_edata (bfd * abfd, void * vfile)
{
FILE *file = (FILE *) 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
{
{
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;
fprintf (file,
_("\nThere is an export table in %s, but it does not fit into that section\n"),
section->name);
- return TRUE;
+ return true;
}
}
/* 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 */
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);
free (data);
- return TRUE;
+ return true;
}
/* This really is architecture dependent. On IA-64, a .pdata entry
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 (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)
datasize = section->size;
if (datasize == 0)
- return TRUE;
+ return true;
/* 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;
+ return false;
}
if (! bfd_malloc_and_get_section (abfd, section, &data))
{
free (data);
- return FALSE;
+ return false;
}
start = 0;
bfd_fprintf_vma (abfd, file, prolog_end_addr);
fprintf (file, " %x", em_data);
#endif
-
-#ifdef POWERPC_LE_PE
- 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. */
- switch (eh_data)
- {
- case 0x01:
- fprintf (file, _(" Register save millicode"));
- break;
- case 0x02:
- fprintf (file, _(" Register restore millicode"));
- break;
- case 0x03:
- fprintf (file, _(" Glue code sequence"));
- break;
- default:
- break;
- }
- }
-#endif
fprintf (file, "\n");
}
free (data);
- return TRUE;
+ return true;
#undef PDATA_ROW_SIZE
}
/* 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)
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)
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;
cleanup_syms (& cache);
- return TRUE;
+ return true;
#undef PDATA_ROW_SIZE
}
"UNKNOWN", /* MUST be last. */
};
-static bfd_boolean
+static bool
pe_print_reloc (bfd * abfd, void * vfile)
{
FILE *file = (FILE *) 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"));
if (! bfd_malloc_and_get_section (abfd, section, &data))
{
free (data);
- return FALSE;
+ return false;
}
p = data;
free (data);
- return TRUE;
+ return true;
}
\f
/* A data structure describing the regions of a .rsrc section.
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;
{
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);
{
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);
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;
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;
(int) (regions.resource_start - regions.section_start));
free (regions.section_start);
- return TRUE;
+ return true;
}
#define IMAGE_NUMBEROF_DEBUG_TYPES 17
"Repro",
};
-static bfd_boolean
+static bool
pe_print_debugdata (bfd * abfd, void * vfile)
{
FILE *file = (FILE *) 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)
{
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"),
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,
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++)
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);
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)
|| (!(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++)
if (idd.Type == PE_IMAGE_DEBUG_TYPE_REPRO)
{
- res = TRUE;
+ res = true;
break;
}
}
/* Print out the program headers. */
-bfd_boolean
+bool
_bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile)
{
FILE *file = (FILE *) 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
case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
subsystem_name = "Wince CUI";
break;
- // These are from UEFI Platform Initialization Specification 1.1.
+ /* These are from UEFI Platform Initialization Specification 1.1. */
case IMAGE_SUBSYSTEM_EFI_APPLICATION:
subsystem_name = "EFI application";
break;
case IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER:
subsystem_name = "SAL runtime driver";
break;
- // This is from revision 8.0 of the MS PE/COFF spec
+ /* This is from revision 8.0 of the MS PE/COFF spec */
case IMAGE_SUBSYSTEM_XBOX:
subsystem_name = "XBOX";
break;
- // Added default case for clarity - subsystem_name is NULL anyway.
+ /* Added default case for clarity - subsystem_name is NULL anyway. */
default:
subsystem_name = NULL;
}
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");
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;
/* 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;
/* 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);
{
bfd_vma addr = ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].VirtualAddress
+ ope->pe_opthdr.ImageBase;
- asection *section = find_section_by_vma (obfd, addr);
+ /* In particular a .buildid section may overlap (in VA space) with
+ whatever section comes ahead of it (largely because of section->size
+ 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;
+ asection *section = find_section_by_vma (obfd, last);
bfd_byte *data;
+ /* PR 17512: file: 0f15796a. */
+ if (section && addr < section->vma)
+ {
+ /* 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;
+ }
+
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 ((unsigned long) ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size
- > section->size - (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
/ sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
{
{
_bfd_error_handler (_("failed to update file offsets in debug directory"));
free (data);
- return FALSE;
+ return false;
}
free (data);
}
else if (section)
{
_bfd_error_handler (_("%pB: failed to read debug data section"), obfd);
- return FALSE;
+ 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,
{
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)
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)
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 =
pei_section_data (ibfd, isec)->pe_flags;
}
- return TRUE;
+ return true;
}
void
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;
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;
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;
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;
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;
}
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;
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;
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;
*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;
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. */
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)
}
static const char *
-rsrc_resource_name (rsrc_entry * entry, rsrc_directory * dir)
+rsrc_resource_name (rsrc_entry *entry, rsrc_directory *dir, char *buffer)
{
- static char buffer [256];
- bfd_boolean is_string = FALSE;
+ bool is_string = false;
buffer[0] = 0;
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;
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)
{
&& !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).
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;
a->value.leaf->data = new_data;
a->value.leaf->size += copy_needed;
- return TRUE;
+ return true;
}
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;
* points_to_entry = next;
points_to_entry = & next->next_entry;
next = entry->next_entry;
- swapped = TRUE;
+ swapped = true;
}
else if (cmp == 0)
{
* points_to_entry = next;
points_to_entry = & next->next_entry;
next = entry->next_entry;
- swapped = TRUE;
+ swapped = true;
}
else
{
|| dir->entry->parent->entry == NULL)
_bfd_error_handler (_(".rsrc merge failure: duplicate leaf"));
else
- _bfd_error_handler (_(".rsrc merge failure: duplicate leaf: %s"),
- rsrc_resource_name (entry, dir));
+ {
+ char buff[256];
+
+ _bfd_error_handler (_(".rsrc merge failure: duplicate leaf: %s"),
+ rsrc_resource_name (entry, dir, buff));
+ }
bfd_set_error (bfd_error_file_truncated);
return;
}
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
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;
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.
/* 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.
/* 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
_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)
_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)
_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)
_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)
+ 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)
_bfd_error_handler
(_("%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE(12)]"
" because .idata$6 is missing"), abfd);
- result = FALSE;
+ result = false;
}
}
}
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
_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
free (tmp_data);
}
else
- result = FALSE;
+ result = false;
}
}
#endif