rm -f e${EMULATION_NAME}.c
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
fragment <<EOF
-/* Copyright (C) 2006-2015 Free Software Foundation, Inc.
+/* Copyright (C) 2006-2020 Free Software Foundation, Inc.
Written by Kai Tietz, OneVision Software GmbH&CoKg.
This file is part of the GNU Binutils.
#include "sysdep.h"
#include "bfd.h"
#include "bfdlink.h"
+#include "ctf-api.h"
#include "getopt.h"
#include "libiberty.h"
#include "filenames.h"
#ifdef DLL_SUPPORT
static int pep_enable_stdcall_fixup = 1; /* 0=disable 1=enable (default). */
static char * pep_out_def_filename = NULL;
-static char * pep_implib_filename = NULL;
static int pep_enable_auto_image_base = 0;
static char * pep_dll_search_prefix = NULL;
#endif
OPTION_STDCALL_ALIASES,
OPTION_ENABLE_STDCALL_FIXUP,
OPTION_DISABLE_STDCALL_FIXUP,
- OPTION_IMPLIB_FILENAME,
OPTION_WARN_DUPLICATE_EXPORTS,
OPTION_IMP_COMPAT,
OPTION_ENABLE_AUTO_IMAGE_BASE,
OPTION_INSERT_TIMESTAMP,
OPTION_NO_INSERT_TIMESTAMP,
OPTION_TERMINAL_SERVER_AWARE,
- OPTION_BUILD_ID
+ OPTION_BUILD_ID,
+ OPTION_ENABLE_RELOC_SECTION
};
static void
{"add-stdcall-alias", no_argument, NULL, OPTION_STDCALL_ALIASES},
{"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP},
{"disable-stdcall-fixup", no_argument, NULL, OPTION_DISABLE_STDCALL_FIXUP},
- {"out-implib", required_argument, NULL, OPTION_IMPLIB_FILENAME},
{"warn-duplicate-exports", no_argument, NULL, OPTION_WARN_DUPLICATE_EXPORTS},
/* getopt() allows abbreviations, so we do this to stop it from
treating -c as an abbreviation for these --compat-implib. */
{"insert-timestamp", no_argument, NULL, OPTION_INSERT_TIMESTAMP},
{"no-insert-timestamp", no_argument, NULL, OPTION_NO_INSERT_TIMESTAMP},
{"build-id", optional_argument, NULL, OPTION_BUILD_ID},
+ {"enable-reloc-section", no_argument, NULL, OPTION_ENABLE_RELOC_SECTION},
{NULL, no_argument, NULL, 0}
};
#define GET_INIT_SYMBOL_NAME(IDX) \
(init[(IDX)].symbol \
- + ((init[(IDX)].is_c_symbol == FALSE || (is_underscoring () == 1)) ? 0 : 1))
+ + ((!init[(IDX)].is_c_symbol || is_underscoring () == 1) ? 0 : 1))
/* Decorates the C visible symbol by underscore, if target requires. */
#define U(CSTR) \
((is_underscoring () == 0) ? CSTR : "_" CSTR)
-/* Get size of constant string for a possible underscore prefixed
- C visible symbol. */
-#define U_SIZE(CSTR) \
- (sizeof (CSTR) + (is_underscoring () == 0 ? 0 : 1))
-
#define D(field,symbol,def,usc) {&pep.field, sizeof (pep.field), def, symbol, 0, usc}
static definfo init[] =
fprintf (file, _(" --subsystem <name>[:<version>] Set required OS subsystem [& version]\n"));
fprintf (file, _(" --support-old-code Support interworking with old code\n"));
fprintf (file, _(" --[no-]leading-underscore Set explicit symbol underscore prefix mode\n"));
- fprintf (file, _(" --[no-]insert-timestamp Use a real timestamp rather than zero. (default)\n"));
+ fprintf (file, _(" --[no-]insert-timestamp Use a real timestamp rather than zero (default)\n"));
fprintf (file, _(" This makes binaries non-deterministic\n"));
#ifdef DLL_SUPPORT
fprintf (file, _(" --add-stdcall-alias Export symbols with and without @nn\n"));
fprintf (file, _(" --exclude-libs lib,lib,... Exclude libraries from automatic export\n"));
fprintf (file, _(" --exclude-modules-for-implib mod,mod,...\n"));
fprintf (file, _(" Exclude objects, archive members from auto\n"));
- fprintf (file, _(" export, place into import library instead.\n"));
+ fprintf (file, _(" export, place into import library instead\n"));
fprintf (file, _(" --export-all-symbols Automatically export all globals to DLL\n"));
fprintf (file, _(" --kill-at Remove @nn from exported symbols\n"));
- fprintf (file, _(" --out-implib <file> Generate import library\n"));
fprintf (file, _(" --output-def <file> Generate a .DEF file for the built DLL\n"));
- fprintf (file, _(" --warn-duplicate-exports Warn about duplicate exports.\n"));
+ fprintf (file, _(" --warn-duplicate-exports Warn about duplicate exports\n"));
fprintf (file, _(" --compat-implib Create backward compatible import libs;\n\
- create __imp_<SYMBOL> as well.\n"));
+ create __imp_<SYMBOL> as well\n"));
fprintf (file, _(" --enable-auto-image-base Automatically choose image base for DLLs\n\
unless user specifies one\n"));
- fprintf (file, _(" --disable-auto-image-base Do not auto-choose image base. (default)\n"));
+ fprintf (file, _(" --disable-auto-image-base Do not auto-choose image base (default)\n"));
fprintf (file, _(" --dll-search-prefix=<string> When linking dynamically to a dll without\n\
an importlib, use <string><basename>.dll\n\
in preference to lib<basename>.dll \n"));
fprintf (file, _(" --disable-auto-import Do not auto-import DATA items from DLLs\n"));
fprintf (file, _(" --enable-runtime-pseudo-reloc Work around auto-import limitations by\n\
adding pseudo-relocations resolved at\n\
- runtime.\n"));
+ runtime\n"));
fprintf (file, _(" --disable-runtime-pseudo-reloc Do not add runtime pseudo-relocations for\n\
- auto-imported DATA.\n"));
+ auto-imported DATA\n"));
fprintf (file, _(" --enable-extra-pep-debug Enable verbose debug output when building\n\
or linking to DLLs (esp. auto-import)\n"));
fprintf (file, _(" --enable-long-section-names Use long COFF section names even in\n\
in object files\n"));
fprintf (file, _(" --high-entropy-va Image is compatible with 64-bit address space\n\
layout randomization (ASLR)\n"));
- fprintf (file, _(" --dynamicbase Image base address may be relocated using\n\
- address space layout randomization (ASLR)\n"));
- fprintf (file, _(" --forceinteg Code integrity checks are enforced\n"));
- fprintf (file, _(" --nxcompat Image is compatible with data execution prevention\n"));
- fprintf (file, _(" --no-isolation Image understands isolation but do not isolate the image\n"));
- fprintf (file, _(" --no-seh Image does not use SEH. No SE handler may\n\
- be called in this image\n"));
- fprintf (file, _(" --no-bind Do not bind this image\n"));
- fprintf (file, _(" --wdmdriver Driver uses the WDM model\n"));
+ fprintf (file, _(" --dynamicbase Image base address may be relocated using\n\
+ address space layout randomization (ASLR)\n"));
+ fprintf (file, _(" --enable-reloc-section Create the base relocation table\n"));
+ fprintf (file, _(" --forceinteg Code integrity checks are enforced\n"));
+ fprintf (file, _(" --nxcompat Image is compatible with data execution prevention\n"));
+ fprintf (file, _(" --no-isolation Image understands isolation but do not isolate the image\n"));
+ fprintf (file, _(" --no-seh Image does not use SEH; no SE handler may\n\
+ be called in this image\n"));
+ fprintf (file, _(" --no-bind Do not bind this image\n"));
+ fprintf (file, _(" --wdmdriver Driver uses the WDM model\n"));
fprintf (file, _(" --tsaware Image is Terminal Server aware\n"));
fprintf (file, _(" --build-id[=STYLE] Generate build ID\n"));
#endif
int i;
static const struct
- {
- const int value;
- const char *entry;
- }
+ {
+ const int value;
+ const char *entry;
+ }
v[] =
{
{ 1, "NtProcessStartup" },
else
{
for (i = 0; v[i].entry; i++)
- if (v[i].value == pep_subsystem)
- break;
+ if (v[i].value == pep_subsystem)
+ break;
/* If no match, use the default. */
if (v[i].entry != NULL)
- entry = v[i].entry;
+ entry = v[i].entry;
else
- entry = default_entry;
+ entry = default_entry;
}
/* Now we check target's default for getting proper symbol_char. */
if (v[i].name == NULL)
{
- einfo (_("%P%F: invalid subsystem type %s\n"), optarg);
+ einfo (_("%F%P: invalid subsystem type %s\n"), optarg);
return;
}
set_pep_name (name, (bfd_vma) strtoull (optarg, &end, 0));
if (end == optarg)
- einfo (_("%P%F: invalid hex number for PE parameter '%s'\n"), optarg);
+ einfo (_("%F%P: invalid hex number for PE parameter '%s'\n"), optarg);
optarg = end;
}
set_pep_value (comname);
}
else if (*optarg)
- einfo (_("%P%F: strange hex info for PE parameter '%s'\n"), optarg);
+ einfo (_("%F%P: strange hex info for PE parameter '%s'\n"), optarg);
}
#define DEFAULT_BUILD_ID_STYLE "md5"
case OPTION_DISABLE_STDCALL_FIXUP:
pep_enable_stdcall_fixup = 0;
break;
- case OPTION_IMPLIB_FILENAME:
- pep_implib_filename = xstrdup (optarg);
- break;
case OPTION_WARN_DUPLICATE_EXPORTS:
pep_dll_warn_dup_exports = 1;
break;
/* Get DLLCharacteristics bits */
case OPTION_HIGH_ENTROPY_VA:
pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA;
- break;
+ /* fall through */
case OPTION_DYNAMIC_BASE:
pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE;
+ /* fall through */
+ case OPTION_ENABLE_RELOC_SECTION:
+ pep_dll_enable_reloc_section = 1;
break;
case OPTION_FORCE_INTEGRITY:
pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY;
pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE;
break;
case OPTION_BUILD_ID:
- if (emit_build_id != NULL)
- {
- free ((char *) emit_build_id);
- emit_build_id = NULL;
- }
+ free ((char *) emit_build_id);
+ emit_build_id = NULL;
if (optarg == NULL)
optarg = DEFAULT_BUILD_ID_STYLE;
if (strcmp (optarg, "none"))
if (pep.FileAlignment > pep.SectionAlignment)
{
- einfo (_("%P: warning, file alignment > section alignment.\n"));
+ einfo (_("%P: warning, file alignment > section alignment\n"));
}
}
after_parse_default ();
}
-/* pep-dll.c directly accesses pep_data_import_dll,
- so it must be defined outside of #ifdef DLL_SUPPORT.
- Note - this variable is deliberately not initialised.
- This allows it to be treated as a common varaible, and only
- exist in one incarnation in a multiple target enabled linker. */
-char * pep_data_import_dll;
-
#ifdef DLL_SUPPORT
static struct bfd_link_hash_entry *pep_undef_found_sym;
if (pep_enable_stdcall_fixup == -1)
{
- einfo (_("Warning: resolving %s by linking to %s\n"),
+ einfo (_("warning: resolving %s by linking to %s\n"),
undef->root.string, cname);
if (! gave_warning_message)
{
if (pep_enable_stdcall_fixup == -1)
{
- einfo (_("Warning: resolving %s by linking to %s\n"),
+ einfo (_("warning: resolving %s by linking to %s\n"),
undef->root.string, sym->root.string);
if (! gave_warning_message)
{
}
}
-static int
-make_import_fixup (arelent *rel, asection *s)
+static void
+make_import_fixup (arelent *rel, asection *s, char *name, const char *symname)
{
struct bfd_symbol *sym = *rel->sym_ptr_ptr;
char addend[8];
memset (addend, 0, sizeof (addend));
switch ((rel->howto->bitsize))
{
- case 8:
- suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 1);
- if (suc && rel->howto->pc_relative)
- _addend = (bfd_vma) ((bfd_signed_vma) ((char) bfd_get_8 (s->owner, addend)));
- else if (suc)
- _addend = ((bfd_vma) bfd_get_8 (s->owner, addend)) & 0xff;
- break;
- case 16:
- suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 2);
- if (suc && rel->howto->pc_relative)
- _addend = (bfd_vma) ((bfd_signed_vma) ((short) bfd_get_16 (s->owner, addend)));
- else if (suc)
- _addend = ((bfd_vma) bfd_get_16 (s->owner, addend)) & 0xffff;
- break;
- case 32:
- suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 4);
- if (suc && rel->howto->pc_relative)
- _addend = (bfd_vma) ((bfd_signed_vma) ((int) bfd_get_32 (s->owner, addend)));
- else if (suc)
- _addend = ((bfd_vma) bfd_get_32 (s->owner, addend)) & 0xffffffff;
- break;
- case 64:
- suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 8);
- if (suc)
- _addend = ((bfd_vma) bfd_get_64 (s->owner, addend));
- break;
+ case 8:
+ suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 1);
+ if (suc && rel->howto->pc_relative)
+ _addend = bfd_get_signed_8 (s->owner, addend);
+ else if (suc)
+ _addend = bfd_get_8 (s->owner, addend);
+ break;
+ case 16:
+ suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 2);
+ if (suc && rel->howto->pc_relative)
+ _addend = bfd_get_signed_16 (s->owner, addend);
+ else if (suc)
+ _addend = bfd_get_16 (s->owner, addend);
+ break;
+ case 32:
+ suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 4);
+ if (suc && rel->howto->pc_relative)
+ _addend = bfd_get_signed_32 (s->owner, addend);
+ else if (suc)
+ _addend = bfd_get_32 (s->owner, addend);
+ break;
+ case 64:
+ suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 8);
+ if (suc)
+ _addend = bfd_get_64 (s->owner, addend);
+ break;
}
if (! suc)
- einfo (_("%C: Cannot get section contents - auto-import exception\n"),
+ einfo (_("%P: %C: cannot get section contents - auto-import exception\n"),
s->owner, s, rel->address);
if (pep_dll_extra_pe_debug)
{
- printf ("import of 0x%lx(0x%lx) sec_addr=0x%lx", (long) _addend, (long) rel->addend, (long) rel->address);
- if (rel->howto->pc_relative) printf (" pcrel");
- printf (" %d bit rel.\n",(int) rel->howto->bitsize);
- }
- pep_create_import_fixup (rel, s, _addend);
-
- return 1;
-}
-
-static void
-pep_find_data_imports (void)
-{
- struct bfd_link_hash_entry *undef, *sym;
-
- if (link_info.pei386_auto_import == 0)
- return;
-
- for (undef = link_info.hash->undefs; undef; undef=undef->u.undef.next)
- {
- if (undef->type == bfd_link_hash_undefined)
- {
- /* C++ symbols are *long*. */
-#define BUF_SIZE 4096
- char buf[BUF_SIZE];
-
- if (pep_dll_extra_pe_debug)
- printf ("%s:%s\n", __FUNCTION__, undef->root.string);
-
- if (strlen (undef->root.string) > (BUF_SIZE - 6))
- {
- /* PR linker/18466. */
- einfo (_("%P: internal error: symbol too long: %s\n"),
- undef->root.string);
- return;
- }
-
- sprintf (buf, "__imp_%s", undef->root.string);
-
- sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
-
- if (sym && sym->type == bfd_link_hash_defined)
- {
- bfd *b = sym->u.def.section->owner;
- asymbol **symbols;
- int nsyms, i;
-
- if (!bfd_generic_link_read_symbols (b))
- {
- einfo (_("%B%F: could not read symbols: %E\n"), b);
- return;
- }
-
- symbols = bfd_get_outsymbols (b);
- nsyms = bfd_get_symcount (b);
-
- for (i = 0; i < nsyms; i++)
- {
- if (! CONST_STRNEQ (symbols[i]->name, U ("_head_")))
- continue;
-
- if (pep_dll_extra_pe_debug)
- printf ("->%s\n", symbols[i]->name);
-
- pep_data_import_dll = (char*) (symbols[i]->name +
- U_SIZE ("_head_") - 1);
- break;
- }
-
- pep_walk_relocs_of_symbol (&link_info, undef->root.string,
- make_import_fixup);
-
- /* Let's differentiate it somehow from defined. */
- undef->type = bfd_link_hash_defweak;
- /* We replace original name with __imp_ prefixed, this
- 1) may trash memory 2) leads to duplicate symbol generation.
- Still, IMHO it's better than having name poluted. */
- undef->root.string = sym->root.string;
- undef->u.def.value = sym->u.def.value;
- undef->u.def.section = sym->u.def.section;
- }
- }
+ printf ("import of 0x%lx(0x%lx) sec_addr=0x%lx",
+ (long) _addend, (long) rel->addend, (long) rel->address);
+ if (rel->howto->pc_relative)
+ printf (" pcrel");
+ printf (" %d bit rel.\n", (int) rel->howto->bitsize);
}
+
+ pep_create_import_fixup (rel, s, _addend, name, symname);
}
static bfd_boolean
status = bfd_bread (&b, (bfd_size_type) 1, abfd);
if (status < 1)
- {
- break;
- }
+ {
+ break;
+ }
(*process) (&b, 1, arg);
filepos += 1;
{
struct bfd_link_order *l = NULL;
for (l = asec->map_head.link_order; l != NULL; l = l->next)
- {
- if (l->type == bfd_indirect_link_order)
- {
- if (l->u.indirect.section == t->build_id.sec)
- {
- link_order = l;
- break;
- }
- }
- }
+ {
+ if (l->type == bfd_indirect_link_order)
+ {
+ if (l->u.indirect.section == t->build_id.sec)
+ {
+ link_order = l;
+ break;
+ }
+ }
+ }
if (link_order)
- break;
+ break;
}
if (!link_order)
{
einfo (_("%P: warning: .buildid section discarded,"
- " --build-id ignored.\n"));
+ " --build-id ignored\n"));
return TRUE;
}
if (!validate_build_id_style (emit_build_id))
{
- einfo ("%P: warning: unrecognized --build-id style ignored.\n");
+ einfo (_("%P: warning: unrecognized --build-id style ignored\n"));
return FALSE;
}
return TRUE;
}
- einfo ("%P: warning: Cannot create .buildid section,"
- " --build-id ignored.\n");
+ einfo (_("%P: warning: cannot create .buildid section,"
+ " --build-id ignored\n"));
return FALSE;
}
bfd_hash_traverse (&link_info.hash->table, pr_sym, NULL);
for (a = link_info.input_bfds; a; a = a->link.next)
- printf ("*%s\n",a->filename);
+ printf ("*%s\n", bfd_get_filename (a));
}
#endif
FIXME: This should be done via a function, rather than by
including an internal BFD header. */
- if (coff_data (link_info.output_bfd) == NULL
+ if (bfd_get_flavour (link_info.output_bfd) != bfd_target_coff_flavour
+ || coff_data (link_info.output_bfd) == NULL
|| coff_data (link_info.output_bfd)->pe == 0)
- einfo (_("%F%P: cannot perform PE operations on non PE output file '%B'.\n"),
+ einfo (_("%F%P: cannot perform PE operations on non PE output file '%pB'\n"),
link_info.output_bfd);
pe_data (link_info.output_bfd)->pe_opthdr = pep;
pe_data (link_info.output_bfd)->dll = init[DLLOFF].value;
pe_data (link_info.output_bfd)->real_flags |= real_flags;
- pe_data (link_info.output_bfd)->insert_timestamp = insert_timestamp;
+ if (insert_timestamp)
+ pe_data (link_info.output_bfd)->timestamp = -1;
+ else
+ pe_data (link_info.output_bfd)->timestamp = 0;
/* At this point we must decide whether to use long section names
in the output or not. If the user hasn't explicitly specified
pep_output_file_set_long_section_names (link_info.output_bfd);
#ifdef DLL_SUPPORT
- if (pep_enable_stdcall_fixup) /* -1=warn or 1=disable */
- pep_fixup_stdcalls ();
-
pep_process_import_defs (link_info.output_bfd, &link_info);
- pep_find_data_imports ();
+ if (link_info.pei386_auto_import) /* -1=warn or 1=enable */
+ pep_find_data_imports (U ("_head_"), make_import_fixup);
- /* As possibly new symbols are added by imports, we rerun
- stdcall/fastcall fixup here. */
- if (pep_enable_stdcall_fixup) /* -1=warn or 1=disable */
+ /* The implementation of the feature is rather dumb and would cause the
+ compilation time to go through the roof if there are many undefined
+ symbols in the link, so it needs to be run after auto-import. */
+ if (pep_enable_stdcall_fixup) /* -1=warn or 1=enable */
pep_fixup_stdcalls ();
#ifndef TARGET_IS_i386pep
if (!bfd_generic_link_read_symbols (is->the_bfd))
{
- einfo (_("%B%F: could not read symbols: %E\n"),
+ einfo (_("%F%P: %pB: could not read symbols: %E\n"),
is->the_bfd);
return;
}
if (nrelocs < 0)
{
free (relocs);
- einfo ("%X%P: unable to process relocs: %E\n");
+ einfo (_("%X%P: unable to process relocs: %E\n"));
return;
}
{
struct bfd_symbol *s;
struct bfd_link_hash_entry * blhe;
- char *other_bfd_filename;
- char *n;
+ const char *other_bfd_filename;
s = (relocs[i]->sym_ptr_ptr)[0];
continue;
/* Rename this implib to match the other one. */
- n = xmalloc (strlen (other_bfd_filename) + 1);
- strcpy (n, other_bfd_filename);
- is->the_bfd->my_archive->filename = n;
+ if (!bfd_set_filename (is->the_bfd->my_archive,
+ other_bfd_filename))
+ einfo ("%F%P: %pB: %E\n", is->the_bfd);
}
free (relocs);
members, so look for the first element with a .dll
extension, and use that for the remainder of the
comparisons. */
- pnt = strrchr (is3->the_bfd->filename, '.');
+ pnt = strrchr (bfd_get_filename (is3->the_bfd), '.');
if (pnt != NULL && filename_cmp (pnt, ".dll") == 0)
break;
}
{
/* Skip static members, ie anything with a .obj
extension. */
- pnt = strrchr (is2->the_bfd->filename, '.');
+ pnt = strrchr (bfd_get_filename (is2->the_bfd), '.');
if (pnt != NULL && filename_cmp (pnt, ".obj") == 0)
continue;
- if (filename_cmp (is3->the_bfd->filename,
- is2->the_bfd->filename))
+ if (filename_cmp (bfd_get_filename (is3->the_bfd),
+ bfd_get_filename (is2->the_bfd)))
{
is_ms_arch = 0;
break;
/* This fragment might have come from an .obj file in a Microsoft
import, and not an actual import record. If this is the case,
then leave the filename alone. */
- pnt = strrchr (is->the_bfd->filename, '.');
+ pnt = strrchr (bfd_get_filename (is->the_bfd), '.');
if (is_ms_arch && (filename_cmp (pnt, ".dll") == 0))
{
else /* sentinel */
seq = 'c';
- new_name = xmalloc (strlen (is->the_bfd->filename) + 3);
- sprintf (new_name, "%s.%c", is->the_bfd->filename, seq);
- is->the_bfd->filename = new_name;
-
- new_name = xmalloc (strlen (is->filename) + 3);
- sprintf (new_name, "%s.%c", is->filename, seq);
- is->filename = new_name;
+ new_name
+ = xmalloc (strlen (bfd_get_filename (is->the_bfd)) + 3);
+ sprintf (new_name, "%s.%c",
+ bfd_get_filename (is->the_bfd), seq);
+ is->filename = bfd_set_filename (is->the_bfd, new_name);
+ free (new_name);
+ if (!is->filename)
+ einfo ("%F%P: %pB: %E\n", is->the_bfd);
}
}
}
h = bfd_link_hash_lookup (link_info.hash, buf, TRUE, TRUE, TRUE);
if (h == (struct bfd_link_hash_entry *) NULL)
- einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
+ einfo (_("%F%P: bfd_link_hash_lookup failed: %E\n"));
if (h->type == bfd_link_hash_new)
{
h->type = bfd_link_hash_undefined;
#ifdef DLL_SUPPORT
if (bfd_link_pic (&link_info)
+ || pep_dll_enable_reloc_section
|| (!bfd_link_relocatable (&link_info)
&& pep_def_file->num_exports != 0))
{
pep_dll_fill_sections (link_info.output_bfd, &link_info);
- if (pep_implib_filename)
- pep_dll_generate_implib (pep_def_file, pep_implib_filename, &link_info);
+ if (command_line.out_implib_filename)
+ pep_dll_generate_implib (pep_def_file,
+ command_line.out_implib_filename, &link_info);
}
if (pep_out_def_filename)
struct orphan_save *place;
lang_output_section_statement_type *after;
etree_type *address;
+ flagword flags;
+ asection *nexts;
if (!orphan_init_done)
{
orphan_init_done = 1;
}
+ flags = s->flags;
+ if (!bfd_link_relocatable (&link_info))
+ {
+ nexts = s;
+ while ((nexts = bfd_get_next_section_by_name (nexts->owner,
+ nexts)))
+ if (nexts->output_section == NULL
+ && (nexts->flags & SEC_EXCLUDE) == 0
+ && ((nexts->flags ^ flags) & (SEC_LOAD | SEC_ALLOC)) == 0
+ && (nexts->owner->flags & DYNAMIC) == 0
+ && !bfd_input_just_syms (nexts->owner))
+ flags = (((flags ^ SEC_READONLY)
+ | (nexts->flags ^ SEC_READONLY))
+ ^ SEC_READONLY);
+ }
+
/* Try to put the new output section in a reasonable place based
on the section name and section flags. */
place = NULL;
- if ((s->flags & SEC_ALLOC) == 0)
+ if ((flags & SEC_ALLOC) == 0)
;
- else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
+ else if ((flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
place = &hold[orphan_bss];
- else if ((s->flags & SEC_READONLY) == 0)
+ else if ((flags & SEC_READONLY) == 0)
place = &hold[orphan_data];
- else if ((s->flags & SEC_CODE) == 0)
+ else if ((flags & SEC_CODE) == 0)
{
place = (!strncmp (secname, ".idata\$", 7) ? &hold[orphan_idata]
: &hold[orphan_rodata]);
place->os = lang_output_section_find (place->name);
after = place->os;
if (after == NULL)
- after = lang_output_section_find_by_flags (s, &place->os, NULL);
+ after = lang_output_section_find_by_flags (s, flags, &place->os,
+ NULL);
if (after == NULL)
/* *ABS* is always the first output section statement. */
- after = (&lang_output_section_statement.head
- ->output_section_statement);
+ after = (void *) lang_os_list.head;
}
/* All sections in an executable must be aligned to a page boundary.
&add_child);
if (bfd_link_relocatable (&link_info))
{
- os->section_alignment = s->alignment_power;
+ os->section_alignment = exp_intop (1U << s->alignment_power);
os->bfd_section->alignment_power = s->alignment_power;
}
}
ls = &(*pl)->input_section;
- lname = bfd_get_section_name (ls->section->owner, ls->section);
+ lname = bfd_section_name (ls->section);
if (strchr (lname, '\$') != NULL
&& (dollar == NULL || strcmp (orig_secname, lname) < 0))
break;
/* Alternate explicit import library for dll's. */
{ "%s.dll.a", FALSE },
/* "libfoo.a" could be either an import lib or a static lib.
- For backwards compatibility, libfoo.a needs to precede
- libfoo.dll and foo.dll in the search. */
+ For backwards compatibility, libfoo.a needs to precede
+ libfoo.dll and foo.dll in the search. */
{ "lib%s.a", FALSE },
/* The 'native' spelling of an import lib name is "foo.lib". */
{ "%s.lib", FALSE },
+ /* PR 22948 - Check for an import library. */
+ { "lib%s.lib", FALSE },
#ifdef DLL_SUPPORT
/* Try "<prefix>foo.dll" (preferred dll name, if specified). */
{ "%s%s.dll", TRUE },
hll_default,
gld_${EMULATION_NAME}_after_parse,
gld_${EMULATION_NAME}_after_open,
+ after_check_relocs_default,
+ before_place_orphans_default,
after_allocation_default,
set_output_arch_default,
ldemul_default_target,
gld_${EMULATION_NAME}_recognized_file,
gld_${EMULATION_NAME}_find_potential_libraries,
NULL, /* new_vers_pattern. */
- NULL /* extra_map_file_text */
+ NULL, /* extra_map_file_text */
+ ${LDEMUL_EMIT_CTF_EARLY-NULL},
+ ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL},
+ ${LDEMUL_PRINT_SYMBOL-NULL}
};
EOF