/* Routines to help build PEI-format DLLs (Win32 etc)
- Copyright (C) 1998-2016 Free Software Foundation, Inc.
+ Copyright (C) 1998-2017 Free Software Foundation, Inc.
Written by DJ Delorie <dj@cygnus.com>
This file is part of the GNU Binutils.
#endif
autofilter_symbollist_i386
},
+#ifdef pe_use_x86_64
+ {
+ "pei-x86-64",
+ "pe-bigobj-x86-64",
+ 3 /* R_IMAGEBASE */,
+ PE_ARCH_i386,
+ bfd_arch_i386,
+ FALSE,
+ autofilter_symbollist_i386
+ },
+#endif
{
"pei-shl",
"pe-shl",
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);
}
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;
{
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);
}
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);
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);
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 */
void
pe_walk_relocs_of_symbol (struct bfd_link_info *info,
- const char *name,
- int (*cb) (arelent *, asection *))
+ char *name,
+ int (*cb) (arelent *, asection *, char *))
{
bfd *b;
asection *s;
struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
if (!strcmp (name, sym->name))
- cb (relocs[i], s);
+ cb (relocs[i], s, name);
}
free (relocs);
/* 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;
}
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)
{
}
static char *
-make_import_fixup_mark (arelent *rel)
+make_import_fixup_mark (arelent *rel, char *name)
{
/* We convert reloc to symbol, for later reference. */
- static int counter;
- static char *fixup_name = NULL;
- static size_t buffer_len = 0;
-
+ static unsigned int counter;
struct bfd_symbol *sym = *rel->sym_ptr_ptr;
-
bfd *abfd = bfd_asymbol_bfd (sym);
struct bfd_link_hash_entry *bh;
+ char *fixup_name, buf[26];
+ size_t prefix_len;
- if (!fixup_name)
- {
- fixup_name = xmalloc (384);
- buffer_len = 384;
- }
-
- if (strlen (sym->name) + 25 > buffer_len)
- /* Assume 25 chars for "__fu" + counter + "_". If counter is
- bigger than 20 digits long, we've got worse problems than
- overflowing this buffer... */
- {
- free (fixup_name);
- /* New buffer size is length of symbol, plus 25, but
- then rounded up to the nearest multiple of 128. */
- buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
- fixup_name = xmalloc (buffer_len);
- }
-
- sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
+ /* "name" buffer has space before the symbol name for prefixes. */
+ sprintf (buf, "__fu%d_", counter++);
+ prefix_len = strlen (buf);
+ fixup_name = name - prefix_len;
+ memcpy (fixup_name, buf, prefix_len);
bh = NULL;
bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
}
void
-pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
+pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend, char *name)
{
- char buf[300];
struct bfd_symbol *sym = *rel->sym_ptr_ptr;
struct bfd_link_hash_entry *name_thunk_sym;
struct bfd_link_hash_entry *name_imp_sym;
- const char *name = sym->name;
- char *fixup_name = make_import_fixup_mark (rel);
+ char *fixup_name, *impname;
bfd *b;
int need_import_table = 1;
- sprintf (buf, "__imp_%s", name);
- name_imp_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
+ /* name buffer is allocated with space at beginning for prefixes. */
+ impname = name - (sizeof "__imp_" - 1);
+ memcpy (impname, "__imp_", sizeof "__imp_" - 1);
+ name_imp_sym = bfd_link_hash_lookup (link_info.hash, impname, 0, 0, 1);
- sprintf (buf, "__nm_thnk_%s", name);
+ impname = name - (sizeof "__nm_thnk_" - 1);
+ memcpy (impname, "__nm_thnk_", sizeof "__nm_thnk_" - 1);
+ name_thunk_sym = bfd_link_hash_lookup (link_info.hash, impname, 0, 0, 1);
- name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
+ fixup_name = make_import_fixup_mark (rel, name);
/* For version 2 pseudo relocation we don't need to add an import
if the import symbol is already present. */
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);
}
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;
}
? 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)
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;
}
}
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;
}
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)
{
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
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;
}
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