version 1.5, 2018/04/14 17:52:55 |
version 1.5.2.1, 2020/04/08 14:05:53 |
|
|
rm -f e${EMULATION_NAME}.c |
rm -f e${EMULATION_NAME}.c |
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-) |
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-) |
fragment <<EOF |
fragment <<EOF |
/* Copyright (C) 1995-2016 Free Software Foundation, Inc. |
/* Copyright (C) 1995-2018 Free Software Foundation, Inc. |
|
|
This file is part of the GNU Binutils. |
This file is part of the GNU Binutils. |
|
|
|
|
/* Do this before including bfd.h, so we prototype the right functions. */ |
/* Do this before including bfd.h, so we prototype the right functions. */ |
|
|
#if defined(TARGET_IS_armpe) \ |
#if defined(TARGET_IS_armpe) \ |
|| defined(TARGET_IS_arm_epoc_pe) \ |
|
|| defined(TARGET_IS_arm_wince_pe) |
|| defined(TARGET_IS_arm_wince_pe) |
#define bfd_arm_allocate_interworking_sections \ |
#define bfd_arm_allocate_interworking_sections \ |
bfd_${EMULATION_NAME}_allocate_interworking_sections |
bfd_${EMULATION_NAME}_allocate_interworking_sections |
|
|
#if defined(TARGET_IS_i386pe) \ |
#if defined(TARGET_IS_i386pe) \ |
|| defined(TARGET_IS_shpe) \ |
|| defined(TARGET_IS_shpe) \ |
|| defined(TARGET_IS_armpe) \ |
|| defined(TARGET_IS_armpe) \ |
|| defined(TARGET_IS_arm_epoc_pe) \ |
|
|| defined(TARGET_IS_arm_wince_pe) |
|| defined(TARGET_IS_arm_wince_pe) |
#define DLL_SUPPORT |
#define DLL_SUPPORT |
#endif |
#endif |
Line 138 static const char *emit_build_id; |
|
Line 136 static const char *emit_build_id; |
|
#ifdef DLL_SUPPORT |
#ifdef DLL_SUPPORT |
static int pe_enable_stdcall_fixup = -1; /* 0=disable 1=enable. */ |
static int pe_enable_stdcall_fixup = -1; /* 0=disable 1=enable. */ |
static char *pe_out_def_filename = NULL; |
static char *pe_out_def_filename = NULL; |
static char *pe_implib_filename = NULL; |
|
static int pe_enable_auto_image_base = 0; |
static int pe_enable_auto_image_base = 0; |
static unsigned long pe_auto_image_base = 0x61500000; |
static unsigned long pe_auto_image_base = 0x61500000; |
static char *pe_dll_search_prefix = NULL; |
static char *pe_dll_search_prefix = NULL; |
|
|
#define OPTION_STDCALL_ALIASES (OPTION_KILL_ATS + 1) |
#define OPTION_STDCALL_ALIASES (OPTION_KILL_ATS + 1) |
#define OPTION_ENABLE_STDCALL_FIXUP (OPTION_STDCALL_ALIASES + 1) |
#define OPTION_ENABLE_STDCALL_FIXUP (OPTION_STDCALL_ALIASES + 1) |
#define OPTION_DISABLE_STDCALL_FIXUP (OPTION_ENABLE_STDCALL_FIXUP + 1) |
#define OPTION_DISABLE_STDCALL_FIXUP (OPTION_ENABLE_STDCALL_FIXUP + 1) |
#define OPTION_IMPLIB_FILENAME (OPTION_DISABLE_STDCALL_FIXUP + 1) |
#define OPTION_THUMB_ENTRY (OPTION_DISABLE_STDCALL_FIXUP + 1) |
#define OPTION_THUMB_ENTRY (OPTION_IMPLIB_FILENAME + 1) |
|
#define OPTION_WARN_DUPLICATE_EXPORTS (OPTION_THUMB_ENTRY + 1) |
#define OPTION_WARN_DUPLICATE_EXPORTS (OPTION_THUMB_ENTRY + 1) |
#define OPTION_IMP_COMPAT (OPTION_WARN_DUPLICATE_EXPORTS + 1) |
#define OPTION_IMP_COMPAT (OPTION_WARN_DUPLICATE_EXPORTS + 1) |
#define OPTION_ENABLE_AUTO_IMAGE_BASE (OPTION_IMP_COMPAT + 1) |
#define OPTION_ENABLE_AUTO_IMAGE_BASE (OPTION_IMP_COMPAT + 1) |
|
|
(OPTION_EXCLUDE_LIBS + 1) |
(OPTION_EXCLUDE_LIBS + 1) |
#define OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC \ |
#define OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC \ |
(OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC + 1) |
(OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC + 1) |
#define OPTION_LARGE_ADDRESS_AWARE (OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC + 1) |
#define OPTION_LARGE_ADDRESS_AWARE (OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC + 1) |
#define OPTION_DISABLE_LARGE_ADDRESS_AWARE \ |
#define OPTION_DISABLE_LARGE_ADDRESS_AWARE \ |
(OPTION_LARGE_ADDRESS_AWARE + 1) |
(OPTION_LARGE_ADDRESS_AWARE + 1) |
#define OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1 \ |
#define OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1 \ |
(OPTION_DISABLE_LARGE_ADDRESS_AWARE + 1) |
(OPTION_DISABLE_LARGE_ADDRESS_AWARE + 1) |
#define OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2 \ |
#define OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2 \ |
|
|
(OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2 + 1) |
(OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2 + 1) |
#define OPTION_USE_NUL_PREFIXED_IMPORT_TABLES \ |
#define OPTION_USE_NUL_PREFIXED_IMPORT_TABLES \ |
(OPTION_EXCLUDE_MODULES_FOR_IMPLIB + 1) |
(OPTION_EXCLUDE_MODULES_FOR_IMPLIB + 1) |
#define OPTION_NO_LEADING_UNDERSCORE (OPTION_USE_NUL_PREFIXED_IMPORT_TABLES + 1) |
#define OPTION_NO_LEADING_UNDERSCORE (OPTION_USE_NUL_PREFIXED_IMPORT_TABLES + 1) |
#define OPTION_LEADING_UNDERSCORE (OPTION_NO_LEADING_UNDERSCORE + 1) |
#define OPTION_LEADING_UNDERSCORE (OPTION_NO_LEADING_UNDERSCORE + 1) |
#define OPTION_ENABLE_LONG_SECTION_NAMES \ |
#define OPTION_ENABLE_LONG_SECTION_NAMES \ |
(OPTION_LEADING_UNDERSCORE + 1) |
(OPTION_LEADING_UNDERSCORE + 1) |
#define OPTION_DISABLE_LONG_SECTION_NAMES \ |
#define OPTION_DISABLE_LONG_SECTION_NAMES \ |
Line 323 gld${EMULATION_NAME}_add_options |
|
Line 319 gld${EMULATION_NAME}_add_options |
|
{"add-stdcall-alias", no_argument, NULL, OPTION_STDCALL_ALIASES}, |
{"add-stdcall-alias", no_argument, NULL, OPTION_STDCALL_ALIASES}, |
{"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP}, |
{"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP}, |
{"disable-stdcall-fixup", no_argument, NULL, OPTION_DISABLE_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}, |
{"warn-duplicate-exports", no_argument, NULL, OPTION_WARN_DUPLICATE_EXPORTS}, |
/* getopt() allows abbreviations, so we do this to stop it from |
/* getopt() allows abbreviations, so we do this to stop it from |
treating -c as an abbreviation for these --compat-implib. */ |
treating -c as an abbreviation for these --compat-implib. */ |
|
|
underscore. */ |
underscore. */ |
#define GET_INIT_SYMBOL_NAME(IDX) \ |
#define GET_INIT_SYMBOL_NAME(IDX) \ |
(init[(IDX)].symbol \ |
(init[(IDX)].symbol \ |
+ ((init[(IDX)].is_c_symbol == FALSE || (is_underscoring () != 0)) ? 0 : 1)) |
+ ((!init[(IDX)].is_c_symbol || is_underscoring () != 0) ? 0 : 1)) |
|
|
/* Decorates the C visible symbol by underscore, if target requires. */ |
/* Decorates the C visible symbol by underscore, if target requires. */ |
#define U(CSTR) \ |
#define U(CSTR) \ |
((is_underscoring () == 0) ? CSTR : "_" 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) {&pe.field, sizeof (pe.field), def, symbol, 0, usc} |
#define D(field,symbol,def,usc) {&pe.field, sizeof (pe.field), def, symbol, 0, usc} |
|
|
static definfo init[] = |
static definfo init[] = |
Line 461 gld_${EMULATION_NAME}_list_options (FILE |
|
Line 451 gld_${EMULATION_NAME}_list_options (FILE |
|
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, _(" --export-all-symbols Automatically export all globals to DLL\n")); |
fprintf (file, _(" --kill-at Remove @nn from exported symbols\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, _(" --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\ |
fprintf (file, _(" --compat-implib Create backward compatible import libs;\n\ |
Line 492 gld_${EMULATION_NAME}_list_options (FILE |
|
Line 481 gld_${EMULATION_NAME}_list_options (FILE |
|
executable image files\n")); |
executable image files\n")); |
fprintf (file, _(" --disable-long-section-names Never use long COFF section names, even\n\ |
fprintf (file, _(" --disable-long-section-names Never use long COFF section names, even\n\ |
in object files\n")); |
in object files\n")); |
fprintf (file, _(" --dynamicbase Image base address may be relocated using\n\ |
fprintf (file, _(" --dynamicbase Image base address may be relocated using\n\ |
address space layout randomization (ASLR)\n")); |
address space layout randomization (ASLR)\n")); |
fprintf (file, _(" --forceinteg Code integrity checks are enforced\n")); |
fprintf (file, _(" --forceinteg Code integrity checks are enforced\n")); |
fprintf (file, _(" --nxcompat Image is compatible with data execution prevention\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-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\ |
fprintf (file, _(" --no-seh Image does not use SEH. No SE handler may\n\ |
be called in this image\n")); |
be called in this image\n")); |
fprintf (file, _(" --no-bind Do not bind this image\n")); |
fprintf (file, _(" --no-bind Do not bind this image\n")); |
fprintf (file, _(" --wdmdriver Driver uses the WDM model\n")); |
fprintf (file, _(" --wdmdriver Driver uses the WDM model\n")); |
fprintf (file, _(" --tsaware Image is Terminal Server aware\n")); |
fprintf (file, _(" --tsaware Image is Terminal Server aware\n")); |
fprintf (file, _(" --build-id[=STYLE] Generate build ID\n")); |
fprintf (file, _(" --build-id[=STYLE] Generate build ID\n")); |
} |
} |
Line 535 set_entry_point (void) |
|
Line 524 set_entry_point (void) |
|
int i; |
int i; |
|
|
static const struct |
static const struct |
{ |
{ |
const int value; |
const int value; |
const char *entry; |
const char *entry; |
} |
} |
v[] = |
v[] = |
{ |
{ |
{ 1, "NtProcessStartup" }, |
{ 1, "NtProcessStartup" }, |
Line 564 set_entry_point (void) |
|
Line 553 set_entry_point (void) |
|
else |
else |
{ |
{ |
for (i = 0; v[i].entry; i++) |
for (i = 0; v[i].entry; i++) |
if (v[i].value == pe_subsystem) |
if (v[i].value == pe_subsystem) |
break; |
break; |
|
|
/* If no match, use the default. */ |
/* If no match, use the default. */ |
if (v[i].entry != NULL) |
if (v[i].entry != NULL) |
entry = v[i].entry; |
entry = v[i].entry; |
else |
else |
entry = default_entry; |
entry = default_entry; |
} |
} |
|
|
initial_symbol_char = (is_underscoring () != 0 ? "_" : ""); |
initial_symbol_char = (is_underscoring () != 0 ? "_" : ""); |
Line 655 set_pe_subsystem (void) |
|
Line 644 set_pe_subsystem (void) |
|
|
|
if (v[i].name == NULL) |
if (v[i].name == NULL) |
{ |
{ |
einfo (_("%P%F: invalid subsystem type %s\n"), optarg); |
einfo (_("%F%P: invalid subsystem type %s\n"), optarg); |
return; |
return; |
} |
} |
|
|
Line 676 set_pe_value (char *name) |
|
Line 665 set_pe_value (char *name) |
|
set_pe_name (name, strtoul (optarg, &end, 0)); |
set_pe_name (name, strtoul (optarg, &end, 0)); |
|
|
if (end == optarg) |
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; |
optarg = end; |
} |
} |
Line 693 set_pe_stack_heap (char *resname, char * |
|
Line 682 set_pe_stack_heap (char *resname, char * |
|
set_pe_value (comname); |
set_pe_value (comname); |
} |
} |
else if (*optarg) |
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" |
#define DEFAULT_BUILD_ID_STYLE "md5" |
Line 804 gld${EMULATION_NAME}_handle_option (int |
|
Line 793 gld${EMULATION_NAME}_handle_option (int |
|
case OPTION_DISABLE_STDCALL_FIXUP: |
case OPTION_DISABLE_STDCALL_FIXUP: |
pe_enable_stdcall_fixup = 0; |
pe_enable_stdcall_fixup = 0; |
break; |
break; |
case OPTION_IMPLIB_FILENAME: |
|
pe_implib_filename = xstrdup (optarg); |
|
break; |
|
case OPTION_WARN_DUPLICATE_EXPORTS: |
case OPTION_WARN_DUPLICATE_EXPORTS: |
pe_dll_warn_dup_exports = 1; |
pe_dll_warn_dup_exports = 1; |
break; |
break; |
Line 1008 gld_${EMULATION_NAME}_set_symbols (void) |
|
Line 994 gld_${EMULATION_NAME}_set_symbols (void) |
|
|
|
if (pe.FileAlignment > pe.SectionAlignment) |
if (pe.FileAlignment > pe.SectionAlignment) |
{ |
{ |
einfo (_("%P: warning, file alignment > section alignment.\n")); |
einfo (_("%P: warning, file alignment > section alignment\n")); |
} |
} |
} |
} |
|
|
Line 1029 gld_${EMULATION_NAME}_after_parse (void) |
|
Line 1015 gld_${EMULATION_NAME}_after_parse (void) |
|
after_parse_default (); |
after_parse_default (); |
} |
} |
|
|
/* pe-dll.c directly accesses pe_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 * pe_data_import_dll; |
|
|
|
#ifdef DLL_SUPPORT |
#ifdef DLL_SUPPORT |
static struct bfd_link_hash_entry *pe_undef_found_sym; |
static struct bfd_link_hash_entry *pe_undef_found_sym; |
|
|
Line 1073 change_undef (struct bfd_link_hash_entry |
|
Line 1052 change_undef (struct bfd_link_hash_entry |
|
|
|
if (pe_enable_stdcall_fixup == -1) |
if (pe_enable_stdcall_fixup == -1) |
{ |
{ |
einfo (_("Warning: resolving %s by linking to %s\n"), |
einfo (_("%P: warning: resolving %s by linking to %s\n"), |
undef->root.string, sym->root.string); |
undef->root.string, sym->root.string); |
|
|
if (! gave_warning_message) |
if (! gave_warning_message) |
Line 1116 pe_fixup_stdcalls (void) |
|
Line 1095 pe_fixup_stdcalls (void) |
|
|
|
if (lead_at) |
if (lead_at) |
*cname = '_'; |
*cname = '_'; |
if (at) |
if (at) |
* strchr (cname, '@') = 0; |
* strchr (cname, '@') = 0; |
sym = bfd_link_hash_lookup (link_info.hash, cname, FALSE, FALSE, TRUE); |
sym = bfd_link_hash_lookup (link_info.hash, cname, FALSE, FALSE, TRUE); |
|
|
Line 1136 pe_fixup_stdcalls (void) |
|
Line 1115 pe_fixup_stdcalls (void) |
|
} |
} |
} |
} |
|
|
static int |
static void |
make_import_fixup (arelent *rel, asection *s) |
make_import_fixup (arelent *rel, asection *s, char *name, const char *symname) |
{ |
{ |
struct bfd_symbol *sym = *rel->sym_ptr_ptr; |
struct bfd_symbol *sym = *rel->sym_ptr_ptr; |
char addend[4]; |
char addend[4]; |
|
bfd_vma _addend; |
|
|
if (pe_dll_extra_pe_debug) |
if (pe_dll_extra_pe_debug) |
printf ("arelent: %s@%#lx: add=%li\n", sym->name, |
printf ("arelent: %s@%#lx: add=%li\n", sym->name, |
(unsigned long) rel->address, (long) rel->addend); |
(unsigned long) rel->address, (long) rel->addend); |
|
|
if (! bfd_get_section_contents (s->owner, s, addend, rel->address, sizeof (addend))) |
if (! bfd_get_section_contents (s->owner, s, addend, rel->address, sizeof (addend))) |
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); |
s->owner, s, rel->address); |
|
|
pe_create_import_fixup (rel, s, bfd_get_32 (s->owner, addend)); |
_addend = bfd_get_32 (s->owner, addend); |
|
pe_create_import_fixup (rel, s, _addend, name, symname); |
return 1; |
|
} |
|
|
|
static void |
|
pe_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 (pe_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 (link_info.pei386_auto_import == -1) |
|
{ |
|
static bfd_boolean warned = FALSE; |
|
|
|
info_msg (_("Info: resolving %s by linking to %s (auto-import)\n"), |
|
undef->root.string, buf); |
|
|
|
/* PR linker/4844. */ |
|
if (! warned) |
|
{ |
|
warned = TRUE; |
|
einfo (_("%P: warning: auto-importing has been activated without --enable-auto-import specified on the command line.\n\ |
|
This should work unless it involves constant data structures referencing symbols from auto-imported DLLs.\n")); |
|
} |
|
} |
|
|
|
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 (pe_dll_extra_pe_debug) |
|
printf ("->%s\n", symbols[i]->name); |
|
|
|
pe_data_import_dll = (char *) (symbols[i]->name |
|
+ U_SIZE ("_head_") - 1); |
|
break; |
|
} |
|
|
|
pe_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; |
|
} |
|
} |
|
} |
|
} |
} |
|
|
static bfd_boolean |
static bfd_boolean |
Line 1281 pecoff_checksum_contents (bfd *abfd, |
|
Line 1168 pecoff_checksum_contents (bfd *abfd, |
|
|
|
status = bfd_bread (&b, (bfd_size_type) 1, abfd); |
status = bfd_bread (&b, (bfd_size_type) 1, abfd); |
if (status < 1) |
if (status < 1) |
{ |
{ |
break; |
break; |
} |
} |
|
|
(*process) (&b, 1, arg); |
(*process) (&b, 1, arg); |
filepos += 1; |
filepos += 1; |
Line 1308 write_build_id (bfd *abfd) |
|
Line 1195 write_build_id (bfd *abfd) |
|
{ |
{ |
struct bfd_link_order *l = NULL; |
struct bfd_link_order *l = NULL; |
for (l = asec->map_head.link_order; l != NULL; l = l->next) |
for (l = asec->map_head.link_order; l != NULL; l = l->next) |
{ |
{ |
if (l->type == bfd_indirect_link_order) |
if (l->type == bfd_indirect_link_order) |
{ |
{ |
if (l->u.indirect.section == t->build_id.sec) |
if (l->u.indirect.section == t->build_id.sec) |
{ |
{ |
link_order = l; |
link_order = l; |
break; |
break; |
} |
} |
} |
} |
} |
} |
|
|
if (link_order) |
if (link_order) |
break; |
break; |
} |
} |
|
|
if (!link_order) |
if (!link_order) |
{ |
{ |
einfo (_("%P: warning: .buildid section discarded," |
einfo (_("%P: warning: .buildid section discarded," |
" --build-id ignored.\n")); |
" --build-id ignored\n")); |
return TRUE; |
return TRUE; |
} |
} |
|
|
Line 1398 setup_build_id (bfd *ibfd) |
|
Line 1285 setup_build_id (bfd *ibfd) |
|
|
|
if (!validate_build_id_style (emit_build_id)) |
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 FALSE; |
} |
} |
|
|
Line 1422 setup_build_id (bfd *ibfd) |
|
Line 1309 setup_build_id (bfd *ibfd) |
|
return TRUE; |
return TRUE; |
} |
} |
|
|
einfo ("%P: warning: Cannot create .buildid section," |
einfo (_("%P: warning: cannot create .buildid section," |
" --build-id ignored.\n"); |
" --build-id ignored\n")); |
return FALSE; |
return FALSE; |
} |
} |
|
|
Line 1475 gld_${EMULATION_NAME}_after_open (void) |
|
Line 1362 gld_${EMULATION_NAME}_after_open (void) |
|
|
|
if (coff_data (link_info.output_bfd) == NULL |
if (coff_data (link_info.output_bfd) == NULL |
|| coff_data (link_info.output_bfd)->pe == 0) |
|| 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); |
link_info.output_bfd); |
|
|
pe_data (link_info.output_bfd)->pe_opthdr = pe; |
pe_data (link_info.output_bfd)->pe_opthdr = pe; |
Line 1514 gld_${EMULATION_NAME}_after_open (void) |
|
Line 1401 gld_${EMULATION_NAME}_after_open (void) |
|
pe_output_file_set_long_section_names (link_info.output_bfd); |
pe_output_file_set_long_section_names (link_info.output_bfd); |
|
|
#ifdef DLL_SUPPORT |
#ifdef DLL_SUPPORT |
if (pe_enable_stdcall_fixup) /* -1=warn or 1=disable */ |
|
pe_fixup_stdcalls (); |
|
|
|
pe_process_import_defs (link_info.output_bfd, &link_info); |
pe_process_import_defs (link_info.output_bfd, &link_info); |
|
|
pe_find_data_imports (); |
if (link_info.pei386_auto_import) /* -1=warn or 1=enable */ |
|
pe_find_data_imports (U ("_head_"), make_import_fixup); |
|
|
/* As possibly new symbols are added by imports, we rerun |
/* The implementation of the feature is rather dumb and would cause the |
stdcall/fastcall fixup here. */ |
compilation time to go through the roof if there are many undefined |
if (pe_enable_stdcall_fixup) /* -1=warn or 1=disable */ |
symbols in the link, so it needs to be run after auto-import. */ |
|
if (pe_enable_stdcall_fixup) /* -1=warn or 1=enable */ |
pe_fixup_stdcalls (); |
pe_fixup_stdcalls (); |
|
|
#if defined (TARGET_IS_i386pe) \ |
#if defined (TARGET_IS_i386pe) \ |
|| defined (TARGET_IS_armpe) \ |
|| defined (TARGET_IS_armpe) \ |
|| defined (TARGET_IS_arm_epoc_pe) \ |
|
|| defined (TARGET_IS_arm_wince_pe) |
|| defined (TARGET_IS_arm_wince_pe) |
if (!bfd_link_relocatable (&link_info)) |
if (!bfd_link_relocatable (&link_info)) |
pe_dll_build_sections (link_info.output_bfd, &link_info); |
pe_dll_build_sections (link_info.output_bfd, &link_info); |
Line 1540 gld_${EMULATION_NAME}_after_open (void) |
|
Line 1425 gld_${EMULATION_NAME}_after_open (void) |
|
#endif |
#endif |
#endif /* DLL_SUPPORT */ |
#endif /* DLL_SUPPORT */ |
|
|
#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) |
#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe) |
if (strstr (bfd_get_target (link_info.output_bfd), "arm") == NULL) |
if (strstr (bfd_get_target (link_info.output_bfd), "arm") == NULL) |
{ |
{ |
/* The arm backend needs special fields in the output hash structure. |
/* The arm backend needs special fields in the output hash structure. |
These will only be created if the output format is an arm format, |
These will only be created if the output format is an arm format, |
hence we do not support linking and changing output formats at the |
hence we do not support linking and changing output formats at the |
same time. Use a link followed by objcopy to change output formats. */ |
same time. Use a link followed by objcopy to change output formats. */ |
einfo ("%F%X%P: error: cannot change output format whilst linking ARM binaries\n"); |
einfo (_("%F%P: error: cannot change output format " |
|
"whilst linking %s binaries\n"), "ARM"); |
return; |
return; |
} |
} |
{ |
{ |
Line 1606 gld_${EMULATION_NAME}_after_open (void) |
|
Line 1492 gld_${EMULATION_NAME}_after_open (void) |
|
|
|
if (!bfd_generic_link_read_symbols (is->the_bfd)) |
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); |
is->the_bfd); |
return; |
return; |
} |
} |
Line 1618 gld_${EMULATION_NAME}_after_open (void) |
|
Line 1504 gld_${EMULATION_NAME}_after_open (void) |
|
if (nrelocs < 0) |
if (nrelocs < 0) |
{ |
{ |
free (relocs); |
free (relocs); |
einfo ("%X%P: unable to process relocs: %E\n"); |
einfo (_("%X%P: unable to process relocs: %E\n")); |
return; |
return; |
} |
} |
|
|
Line 1813 gld_${EMULATION_NAME}_after_open (void) |
|
Line 1699 gld_${EMULATION_NAME}_after_open (void) |
|
|
|
if (!bfd_generic_link_read_symbols (is->the_bfd)) |
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); |
is->the_bfd); |
return; |
return; |
} |
} |
Line 1856 gld_${EMULATION_NAME}_before_allocation |
|
Line 1742 gld_${EMULATION_NAME}_before_allocation |
|
if (!ppc_process_before_allocation (is->the_bfd, &link_info)) |
if (!ppc_process_before_allocation (is->the_bfd, &link_info)) |
{ |
{ |
/* xgettext:c-format */ |
/* xgettext:c-format */ |
einfo (_("Errors encountered processing file %s\n"), is->filename); |
einfo (_("%P: errors encountered processing file %s\n"), is->filename); |
} |
} |
} |
} |
} |
} |
Line 1865 gld_${EMULATION_NAME}_before_allocation |
|
Line 1751 gld_${EMULATION_NAME}_before_allocation |
|
ppc_allocate_toc_section (&link_info); |
ppc_allocate_toc_section (&link_info); |
#endif /* TARGET_IS_ppcpe */ |
#endif /* TARGET_IS_ppcpe */ |
|
|
#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) |
#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe) |
/* FIXME: we should be able to set the size of the interworking stub |
/* FIXME: we should be able to set the size of the interworking stub |
section. |
section. |
|
|
Line 1879 gld_${EMULATION_NAME}_before_allocation |
|
Line 1765 gld_${EMULATION_NAME}_before_allocation |
|
(is->the_bfd, & link_info, support_old_code)) |
(is->the_bfd, & link_info, support_old_code)) |
{ |
{ |
/* xgettext:c-format */ |
/* xgettext:c-format */ |
einfo (_("Errors encountered processing file %s for interworking\n"), |
einfo (_("%P: errors encountered processing file %s for interworking\n"), |
is->filename); |
is->filename); |
} |
} |
} |
} |
Line 1887 gld_${EMULATION_NAME}_before_allocation |
|
Line 1773 gld_${EMULATION_NAME}_before_allocation |
|
|
|
/* We have seen it all. Allocate it, and carry on. */ |
/* We have seen it all. Allocate it, and carry on. */ |
bfd_arm_allocate_interworking_sections (& link_info); |
bfd_arm_allocate_interworking_sections (& link_info); |
#endif /* TARGET_IS_armpe || TARGET_IS_arm_epoc_pe || TARGET_IS_arm_wince_pe */ |
#endif /* TARGET_IS_armpe || TARGET_IS_arm_wince_pe */ |
|
|
before_allocation_default (); |
before_allocation_default (); |
} |
} |
Line 1937 gld_${EMULATION_NAME}_unrecognized_file |
|
Line 1823 gld_${EMULATION_NAME}_unrecognized_file |
|
struct bfd_link_hash_entry *h; |
struct bfd_link_hash_entry *h; |
|
|
sprintf (buf, "%s%s", U (""), |
sprintf (buf, "%s%s", U (""), |
pe_def_file->exports[i].internal_name); |
pe_def_file->exports[i].internal_name); |
|
|
h = bfd_link_hash_lookup (link_info.hash, buf, TRUE, TRUE, TRUE); |
h = bfd_link_hash_lookup (link_info.hash, buf, TRUE, TRUE, TRUE); |
if (h == (struct bfd_link_hash_entry *) NULL) |
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) |
if (h->type == bfd_link_hash_new) |
{ |
{ |
h->type = bfd_link_hash_undefined; |
h->type = bfd_link_hash_undefined; |
Line 2002 gld_${EMULATION_NAME}_recognized_file (l |
|
Line 1888 gld_${EMULATION_NAME}_recognized_file (l |
|
#ifdef TARGET_IS_armpe |
#ifdef TARGET_IS_armpe |
pe_dll_id_target ("pei-arm-little"); |
pe_dll_id_target ("pei-arm-little"); |
#endif |
#endif |
#ifdef TARGET_IS_arm_epoc_pe |
|
pe_dll_id_target ("epoc-pei-arm-little"); |
|
#endif |
|
#ifdef TARGET_IS_arm_wince_pe |
#ifdef TARGET_IS_arm_wince_pe |
pe_dll_id_target ("pei-arm-wince-little"); |
pe_dll_id_target ("pei-arm-wince-little"); |
#endif |
#endif |
Line 2017 gld_${EMULATION_NAME}_recognized_file (l |
|
Line 1900 gld_${EMULATION_NAME}_recognized_file (l |
|
static void |
static void |
gld_${EMULATION_NAME}_finish (void) |
gld_${EMULATION_NAME}_finish (void) |
{ |
{ |
#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) |
#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe) |
struct bfd_link_hash_entry * h; |
struct bfd_link_hash_entry * h; |
|
|
if (thumb_entry_symbol != NULL) |
if (thumb_entry_symbol != NULL) |
Line 2057 gld_${EMULATION_NAME}_finish (void) |
|
Line 1940 gld_${EMULATION_NAME}_finish (void) |
|
else |
else |
einfo (_("%P: warning: cannot find thumb start symbol %s\n"), thumb_entry_symbol); |
einfo (_("%P: warning: cannot find thumb start symbol %s\n"), thumb_entry_symbol); |
} |
} |
#endif /* defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) */ |
#endif /* defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe) */ |
|
|
finish_default (); |
finish_default (); |
|
|
Line 2070 gld_${EMULATION_NAME}_finish (void) |
|
Line 1953 gld_${EMULATION_NAME}_finish (void) |
|
) |
) |
{ |
{ |
pe_dll_fill_sections (link_info.output_bfd, &link_info); |
pe_dll_fill_sections (link_info.output_bfd, &link_info); |
if (pe_implib_filename) |
if (command_line.out_implib_filename) |
pe_dll_generate_implib (pe_def_file, pe_implib_filename, &link_info); |
pe_dll_generate_implib (pe_def_file, command_line.out_implib_filename, |
|
&link_info); |
} |
} |
#if defined(TARGET_IS_shpe) |
#if defined(TARGET_IS_shpe) |
/* ARM doesn't need relocs. */ |
/* ARM doesn't need relocs. */ |
Line 2331 gld_${EMULATION_NAME}_open_dynamic_archi |
|
Line 2215 gld_${EMULATION_NAME}_open_dynamic_archi |
|
/* Alternate explicit import library for dll's. */ |
/* Alternate explicit import library for dll's. */ |
{ "%s.dll.a", FALSE }, |
{ "%s.dll.a", FALSE }, |
/* "libfoo.a" could be either an import lib or a static lib. |
/* "libfoo.a" could be either an import lib or a static lib. |
For backwards compatibility, libfoo.a needs to precede |
For backwards compatibility, libfoo.a needs to precede |
libfoo.dll and foo.dll in the search. */ |
libfoo.dll and foo.dll in the search. */ |
{ "lib%s.a", FALSE }, |
{ "lib%s.a", FALSE }, |
/* The 'native' spelling of an import lib name is "foo.lib". */ |
/* The 'native' spelling of an import lib name is "foo.lib". */ |
{ "%s.lib", FALSE }, |
{ "%s.lib", FALSE }, |
|
/* PR 22948 - Check for an import library. */ |
|
{ "lib%s.lib", FALSE }, |
#ifdef DLL_SUPPORT |
#ifdef DLL_SUPPORT |
/* Try "<prefix>foo.dll" (preferred dll name, if specified). */ |
/* Try "<prefix>foo.dll" (preferred dll name, if specified). */ |
{ "%s%s.dll", TRUE }, |
{ "%s%s.dll", TRUE }, |
Line 2463 struct ld_emulation_xfer_struct ld_${EMU |
|
Line 2349 struct ld_emulation_xfer_struct ld_${EMU |
|
hll_default, |
hll_default, |
gld_${EMULATION_NAME}_after_parse, |
gld_${EMULATION_NAME}_after_parse, |
gld_${EMULATION_NAME}_after_open, |
gld_${EMULATION_NAME}_after_open, |
|
after_check_relocs_default, |
after_allocation_default, |
after_allocation_default, |
set_output_arch_default, |
set_output_arch_default, |
ldemul_default_target, |
ldemul_default_target, |