From 611a3ca929d6529f4e7576b0e2ffb588839c1b21 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 3 Mar 2017 11:35:03 +0000 Subject: [PATCH] Make the linker fail if asked to create more than 1^16 ordinal values for PE targets. PR 12969 * pe-dll.c (generate_edata): Fail if the input file(s) require too many ordinals. --- ld/ChangeLog | 6 ++++++ ld/pe-dll.c | 55 +++++++++++++++++++++++++++------------------------- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index c7854374c89..db2354a93ad 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2017-03-03 Max Bolingbroke + + PR 12969 + * pe-dll.c (generate_edata): Fail if the input file(s) require too + many ordinals. + 2017-03-02 Alan Modra * testsuite/ld-elf/shared.exp: Pass -ansi when compiling new.cc diff --git a/ld/pe-dll.c b/ld/pe-dll.c index ac7c70ccf48..bb17b7dca6b 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -428,7 +428,7 @@ pe_dll_id_target (const char *target) pe_leading_underscore = (u != 0 ? 1 : 0); return; } - einfo (_("%XUnsupported PEI architecture: %s\n"), target); + einfo (_("%P%X: Unsupported PEI architecture: %s\n"), target); exit (1); } @@ -797,7 +797,7 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info * if (tmp_at) *tmp_at = 0; else - einfo (_("%XCannot export %s: invalid export name\n"), + einfo (_("%P%X: Cannot export %s: invalid export name\n"), pe_def_file->exports[i].name); pe_def_file->exports[i].name = tmp; resort_needed = TRUE; @@ -849,14 +849,14 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info * { if (pe_dll_warn_dup_exports) /* xgettext:c-format */ - einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"), + einfo (_("%P%X: Error, duplicate EXPORT with ordinals: %s (%d vs %d)\n"), e[j - 1].name, e[j - 1].ordinal, e[i].ordinal); } else { if (pe_dll_warn_dup_exports) /* xgettext:c-format */ - einfo (_("Warning, duplicate EXPORT: %s\n"), + einfo (_("%P: Warning, duplicate EXPORT: %s\n"), e[j - 1].name); } @@ -966,20 +966,20 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info * else if (blhe && blhe->type == bfd_link_hash_undefined) { /* xgettext:c-format */ - einfo (_("%XCannot export %s: symbol not defined\n"), + einfo (_("%P%X: Cannot export %s: symbol not defined\n"), int_name); } else if (blhe) { /* xgettext:c-format */ - einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"), + einfo (_("%P%X: Cannot export %s: symbol wrong type (%d vs %d)\n"), int_name, blhe->type, bfd_link_hash_defined); } else { /* xgettext:c-format */ - einfo (_("%XCannot export %s: symbol not found\n"), + einfo (_("%P%X: Cannot export %s: symbol not found\n"), int_name); } free (name); @@ -1093,7 +1093,7 @@ generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED) if (pi != -1) { /* xgettext:c-format */ - einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"), + einfo (_("%P%X: Error: ordinal used twice: %d (%s vs %s)\n"), pe_def_file->exports[i].ordinal, pe_def_file->exports[i].name, pe_def_file->exports[pi].name); @@ -1126,6 +1126,12 @@ generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED) pe_def_file->exports[i].ordinal = next_ordinal; } + /* PR 12969: Check for more than 1^16 ordinals. */ + if (max_ordinal > 65535 || next_ordinal > 65535) + /* xgettext:c-format */ + einfo(_("%P%X: Error: export ordinal too large: %d\n"), + max_ordinal > next_ordinal ? max_ordinal : next_ordinal); + /* OK, now we can allocate some memory. */ edata_sz = (40 /* directory */ + 4 * export_table_size /* addresses */ @@ -1483,7 +1489,7 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info) /* Fall through. */ default: /* xgettext:c-format */ - einfo (_("%XError: %d-bit reloc in dll\n"), + einfo (_("%P%X: Error: %d-bit reloc in dll\n"), relocs[i]->howto->bitsize); break; } @@ -1611,8 +1617,8 @@ pe_dll_generate_def_file (const char *pe_out_def_filename) if (out == NULL) /* xgettext:c-format */ - einfo (_("%s: Can't open output def file %s\n"), - program_name, pe_out_def_filename); + einfo (_("%P: Can't open output def file %s\n"), + pe_out_def_filename); if (pe_def_file) { @@ -2695,11 +2701,8 @@ pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend) runtime_pseudo_relocs_created++; } else if (addend != 0) - { - einfo (_("%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"), - s->owner, s, rel->address, sym->name); - einfo ("%X"); - } + einfo (_("%P%X%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"), + s->owner, s, rel->address, sym->name); } @@ -2726,7 +2729,7 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_ if (!outarch) { /* xgettext:c-format */ - einfo (_("%XCan't open .lib file: %s\n"), impfilename); + einfo (_("%P%X: Can't open .lib file: %s\n"), impfilename); return; } @@ -2761,7 +2764,7 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_ ? ibfd->my_archive->filename : ibfd->filename, NULL); if (!newbfd) { - einfo (_("%Xbfd_openr %s: %E\n"), ibfd->filename); + einfo (_("%P%X: bfd_openr %s: %E\n"), ibfd->filename); return; } if (ibfd->my_archive) @@ -2773,7 +2776,7 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_ bfd *arbfd = newbfd; if (!bfd_check_format_matches (arbfd, bfd_archive, NULL)) { - einfo (_("%X%s(%s): can't find member in non-archive file"), + einfo (_("%P%X: %s(%s): can't find member in non-archive file"), ibfd->my_archive->filename, ibfd->filename); return; } @@ -2785,7 +2788,7 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_ } if (!newbfd) { - einfo (_("%X%s(%s): can't find member in archive"), + einfo (_("%P%X: %s(%s): can't find member in archive"), ibfd->my_archive->filename, ibfd->filename); return; } @@ -2860,10 +2863,10 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_ head = ar_tail; if (! bfd_set_archive_head (outarch, head)) - einfo ("%Xbfd_set_archive_head: %E\n"); + einfo ("%P%X: bfd_set_archive_head: %E\n"); if (! bfd_close (outarch)) - einfo ("%Xbfd_close %s: %E\n", impfilename); + einfo ("%P%X: bfd_close %s: %E\n", impfilename); while (head != NULL) { @@ -3047,7 +3050,7 @@ add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo) ldlang_add_file (fake_file); if (!bfd_link_add_symbols (abfd, linfo)) - einfo ("%Xaddsym %s: %E\n", name); + einfo ("%P%X: addsym %s: %E\n", name); } void @@ -3233,14 +3236,14 @@ pe_implied_import_dll (const char *filename) dll = bfd_openr (filename, pe_details->target_name); if (!dll) { - einfo ("%Xopen %s: %E\n", filename); + einfo ("%P%X: open %s: %E\n", filename); return FALSE; } /* PEI dlls seem to be bfd_objects. */ if (!bfd_check_format (dll, bfd_object)) { - einfo ("%X%s: this doesn't appear to be a DLL\n", filename); + einfo ("%P%X: %s: this doesn't appear to be a DLL\n", filename); return FALSE; } @@ -3411,7 +3414,7 @@ pe_output_file_set_long_section_names (bfd *abfd) if (pe_use_coff_long_section_names < 0) return; if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names)) - einfo (_("%XError: can't use long section names on this arch\n")); + einfo (_("%P%X: Error: can't use long section names on this arch\n")); } /* These are the main functions, called from the emulation. The first -- 2.30.2