mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-15 04:31:49 +08:00
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.
This commit is contained in:
parent
d20928fac9
commit
611a3ca929
@ -1,3 +1,9 @@
|
||||
2017-03-03 Max Bolingbroke <batterseapower@hotmail.com>
|
||||
|
||||
PR 12969
|
||||
* pe-dll.c (generate_edata): Fail if the input file(s) require too
|
||||
many ordinals.
|
||||
|
||||
2017-03-02 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* testsuite/ld-elf/shared.exp: Pass -ansi when compiling new.cc
|
||||
|
55
ld/pe-dll.c
55
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
|
||||
|
Loading…
Reference in New Issue
Block a user