diff options
Diffstat (limited to 'contrib/binutils/ld/emultempl/pe.em')
-rw-r--r-- | contrib/binutils/ld/emultempl/pe.em | 982 |
1 files changed, 492 insertions, 490 deletions
diff --git a/contrib/binutils/ld/emultempl/pe.em b/contrib/binutils/ld/emultempl/pe.em index 474b984..7d6c2e8 100644 --- a/contrib/binutils/ld/emultempl/pe.em +++ b/contrib/binutils/ld/emultempl/pe.em @@ -9,22 +9,22 @@ rm -f e${EMULATION_NAME}.c (echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-) cat >>e${EMULATION_NAME}.c <<EOF /* This file is part of GLD, the Gnu Linker. - Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 + Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* For WINDOWS_NT */ /* The original file generated returned different default scripts depending @@ -68,8 +68,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "deffile.h" #include "pe-dll.h" - -#include <ctype.h> +#include "safe-ctype.h" /* Permit the emulation parameters to override the default section alignment by setting OVERRIDE_SECTION_ALIGNMENT. FIXME: This makes @@ -104,42 +103,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #define PE_DEF_FILE_ALIGNMENT 0x00000200 #endif -static void gld_${EMULATION_NAME}_set_symbols PARAMS ((void)); -static void gld_${EMULATION_NAME}_after_open PARAMS ((void)); -static void gld_${EMULATION_NAME}_before_parse PARAMS ((void)); -static void gld_${EMULATION_NAME}_after_parse PARAMS ((void)); -static void gld_${EMULATION_NAME}_before_allocation PARAMS ((void)); -static asection *output_prev_sec_find - PARAMS ((lang_output_section_statement_type *)); -static boolean gld_${EMULATION_NAME}_place_orphan - PARAMS ((lang_input_statement_type *, asection *)); -static char *gld_${EMULATION_NAME}_get_script PARAMS ((int *)); -static int gld_${EMULATION_NAME}_parse_args PARAMS ((int, char **)); -static void gld_${EMULATION_NAME}_finish PARAMS ((void)); -static boolean gld_${EMULATION_NAME}_open_dynamic_archive - PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *)); -static void gld_${EMULATION_NAME}_list_options PARAMS ((FILE *)); -static void set_pe_name PARAMS ((char *, long)); -static void set_pe_subsystem PARAMS ((void)); -static void set_pe_value PARAMS ((char *)); -static void set_pe_stack_heap PARAMS ((char *, char *)); - -#ifdef DLL_SUPPORT -static boolean pe_undef_cdecl_match - PARAMS ((struct bfd_link_hash_entry *, PTR)); -static void pe_fixup_stdcalls PARAMS ((void)); -static int make_import_fixup PARAMS ((arelent *, asection *)); -static void pe_find_data_imports PARAMS ((void)); -#endif - -static boolean pr_sym PARAMS ((struct bfd_hash_entry *, PTR string)); -static boolean gld_${EMULATION_NAME}_unrecognized_file - PARAMS ((lang_input_statement_type *)); -static boolean gld_${EMULATION_NAME}_recognized_file - PARAMS ((lang_input_statement_type *)); -static int gld_${EMULATION_NAME}_find_potential_libraries - PARAMS ((char *, lang_input_statement_type *)); - static struct internal_extra_pe_aouthdr pe; static int dll; @@ -148,7 +111,7 @@ static char * thumb_entry_symbol = NULL; static lang_assignment_statement_type *image_base_statement = 0; #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_implib_filename = NULL; static int pe_enable_auto_image_base = 0; @@ -158,28 +121,21 @@ static char *pe_dll_search_prefix = NULL; extern const char *output_filename; static void -gld_${EMULATION_NAME}_before_parse() +gld_${EMULATION_NAME}_before_parse (void) { - const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}"); - if (arch) - { - ldfile_output_architecture = arch->arch; - ldfile_output_machine = arch->mach; - ldfile_output_machine_name = arch->printable_name; - } - else - ldfile_output_architecture = bfd_arch_${ARCH}; + ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`); output_filename = "${EXECUTABLE_NAME:-a.exe}"; #ifdef DLL_SUPPORT - config.dynamic_link = true; + config.dynamic_link = TRUE; config.has_shared = 1; link_info.pei386_auto_import = -1; + link_info.pei386_runtime_pseudo_reloc = FALSE; #if (PE_DEF_SUBSYSTEM == 9) || (PE_DEF_SUBSYSTEM == 2) #if defined TARGET_IS_mipspe || defined TARGET_IS_armpe - lang_add_entry ("WinMainCRTStartup", 1); + lang_add_entry ("WinMainCRTStartup", FALSE); #else - lang_add_entry ("_WinMainCRTStartup", 1); + lang_add_entry ("_WinMainCRTStartup", FALSE); #endif #endif #endif @@ -187,7 +143,7 @@ gld_${EMULATION_NAME}_before_parse() /* PE format extra command line options. */ -/* Used for setting flags in the PE header. */ +/* Used for setting flags in the PE header. */ #define OPTION_BASE_FILE (300 + 1) #define OPTION_DLL (OPTION_BASE_FILE + 1) #define OPTION_FILE_ALIGNMENT (OPTION_DLL + 1) @@ -199,8 +155,8 @@ gld_${EMULATION_NAME}_before_parse() #define OPTION_MINOR_OS_VERSION (OPTION_MINOR_IMAGE_VERSION + 1) #define OPTION_MINOR_SUBSYSTEM_VERSION (OPTION_MINOR_OS_VERSION + 1) #define OPTION_SECTION_ALIGNMENT (OPTION_MINOR_SUBSYSTEM_VERSION + 1) -#define OPTION_STACK (OPTION_SECTION_ALIGNMENT + 1) -#define OPTION_SUBSYSTEM (OPTION_STACK + 1) +#define OPTION_STACK (OPTION_SECTION_ALIGNMENT + 1) +#define OPTION_SUBSYSTEM (OPTION_STACK + 1) #define OPTION_HEAP (OPTION_SUBSYSTEM + 1) #define OPTION_SUPPORT_OLD_CODE (OPTION_HEAP + 1) #define OPTION_OUT_DEF (OPTION_SUPPORT_OLD_CODE + 1) @@ -222,54 +178,73 @@ gld_${EMULATION_NAME}_before_parse() #define OPTION_DLL_DISABLE_AUTO_IMPORT (OPTION_DLL_ENABLE_AUTO_IMPORT + 1) #define OPTION_ENABLE_EXTRA_PE_DEBUG (OPTION_DLL_DISABLE_AUTO_IMPORT + 1) #define OPTION_EXCLUDE_LIBS (OPTION_ENABLE_EXTRA_PE_DEBUG + 1) +#define OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC \ + (OPTION_EXCLUDE_LIBS + 1) +#define OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC \ + (OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC + 1) -static struct option longopts[] = { - /* PE options */ - {"base-file", required_argument, NULL, OPTION_BASE_FILE}, - {"dll", no_argument, NULL, OPTION_DLL}, - {"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT}, - {"heap", required_argument, NULL, OPTION_HEAP}, - {"image-base", required_argument, NULL, OPTION_IMAGE_BASE}, - {"major-image-version", required_argument, NULL, OPTION_MAJOR_IMAGE_VERSION}, - {"major-os-version", required_argument, NULL, OPTION_MAJOR_OS_VERSION}, - {"major-subsystem-version", required_argument, NULL, OPTION_MAJOR_SUBSYSTEM_VERSION}, - {"minor-image-version", required_argument, NULL, OPTION_MINOR_IMAGE_VERSION}, - {"minor-os-version", required_argument, NULL, OPTION_MINOR_OS_VERSION}, - {"minor-subsystem-version", required_argument, NULL, OPTION_MINOR_SUBSYSTEM_VERSION}, - {"section-alignment", required_argument, NULL, OPTION_SECTION_ALIGNMENT}, - {"stack", required_argument, NULL, OPTION_STACK}, - {"subsystem", required_argument, NULL, OPTION_SUBSYSTEM}, - {"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE}, - {"thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY}, +static void +gld${EMULATION_NAME}_add_options + (int ns ATTRIBUTE_UNUSED, char **shortopts ATTRIBUTE_UNUSED, int nl, + struct option **longopts, int nrl ATTRIBUTE_UNUSED, + struct option **really_longopts ATTRIBUTE_UNUSED) +{ + static const struct option xtra_long[] = { + /* PE options */ + {"base-file", required_argument, NULL, OPTION_BASE_FILE}, + {"dll", no_argument, NULL, OPTION_DLL}, + {"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT}, + {"heap", required_argument, NULL, OPTION_HEAP}, + {"image-base", required_argument, NULL, OPTION_IMAGE_BASE}, + {"major-image-version", required_argument, NULL, OPTION_MAJOR_IMAGE_VERSION}, + {"major-os-version", required_argument, NULL, OPTION_MAJOR_OS_VERSION}, + {"major-subsystem-version", required_argument, NULL, OPTION_MAJOR_SUBSYSTEM_VERSION}, + {"minor-image-version", required_argument, NULL, OPTION_MINOR_IMAGE_VERSION}, + {"minor-os-version", required_argument, NULL, OPTION_MINOR_OS_VERSION}, + {"minor-subsystem-version", required_argument, NULL, OPTION_MINOR_SUBSYSTEM_VERSION}, + {"section-alignment", required_argument, NULL, OPTION_SECTION_ALIGNMENT}, + {"stack", required_argument, NULL, OPTION_STACK}, + {"subsystem", required_argument, NULL, OPTION_SUBSYSTEM}, + {"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE}, + {"thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY}, #ifdef DLL_SUPPORT - /* getopt allows abbreviations, so we do this to stop it from treating -o - as an abbreviation for this option */ - {"output-def", required_argument, NULL, OPTION_OUT_DEF}, - {"output-def", required_argument, NULL, OPTION_OUT_DEF}, - {"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL}, - {"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMBOLS}, - {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS}, - {"kill-at", no_argument, NULL, OPTION_KILL_ATS}, - {"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}, - {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT}, - {"enable-auto-image-base", no_argument, NULL, OPTION_ENABLE_AUTO_IMAGE_BASE}, - {"disable-auto-image-base", no_argument, NULL, OPTION_DISABLE_AUTO_IMAGE_BASE}, - {"dll-search-prefix", required_argument, NULL, OPTION_DLL_SEARCH_PREFIX}, - {"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES}, - {"enable-auto-import", no_argument, NULL, OPTION_DLL_ENABLE_AUTO_IMPORT}, - {"disable-auto-import", no_argument, NULL, OPTION_DLL_DISABLE_AUTO_IMPORT}, - {"enable-extra-pe-debug", no_argument, NULL, OPTION_ENABLE_EXTRA_PE_DEBUG}, + /* getopt allows abbreviations, so we do this to stop it from treating -o + as an abbreviation for this option */ + {"output-def", required_argument, NULL, OPTION_OUT_DEF}, + {"output-def", required_argument, NULL, OPTION_OUT_DEF}, + {"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL}, + {"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMBOLS}, + {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS}, + {"kill-at", no_argument, NULL, OPTION_KILL_ATS}, + {"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. */ + {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT}, + {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT}, + {"enable-auto-image-base", no_argument, NULL, OPTION_ENABLE_AUTO_IMAGE_BASE}, + {"disable-auto-image-base", no_argument, NULL, OPTION_DISABLE_AUTO_IMAGE_BASE}, + {"dll-search-prefix", required_argument, NULL, OPTION_DLL_SEARCH_PREFIX}, + {"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES}, + {"enable-auto-import", no_argument, NULL, OPTION_DLL_ENABLE_AUTO_IMPORT}, + {"disable-auto-import", no_argument, NULL, OPTION_DLL_DISABLE_AUTO_IMPORT}, + {"enable-extra-pe-debug", no_argument, NULL, OPTION_ENABLE_EXTRA_PE_DEBUG}, + {"enable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC}, + {"disable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC}, #endif - {NULL, no_argument, NULL, 0} -}; + {NULL, no_argument, NULL, 0} + }; + *longopts = (struct option *) + xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long)); + memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long)); +} /* PE/WIN32; added routines to get the subsystem type, heap and/or stack - parameters which may be input from the command line */ + parameters which may be input from the command line. */ typedef struct { @@ -310,9 +285,9 @@ static definfo init[] = { NULL, 0, 0, NULL, 0 } }; + static void -gld_${EMULATION_NAME}_list_options (file) - FILE * file; +gld_${EMULATION_NAME}_list_options (FILE *file) { fprintf (file, _(" --base_file <basefile> Generate a base file for relocatable DLLs\n")); fprintf (file, _(" --dll Set image base to the default for DLLs\n")); @@ -335,7 +310,7 @@ gld_${EMULATION_NAME}_list_options (file) fprintf (file, _(" --disable-stdcall-fixup Don't link _sym to _sym@nn\n")); fprintf (file, _(" --enable-stdcall-fixup Link _sym to _sym@nn without warnings\n")); fprintf (file, _(" --exclude-symbols sym,sym,... Exclude symbols from automatic export\n")); - fprintf (file, _(" --exclude-libs lib,lib,... Exclude libraries from automatic export\n")); + fprintf (file, _(" --exclude-libs lib,lib,... Exclude libraries from automatic export\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")); @@ -346,24 +321,29 @@ gld_${EMULATION_NAME}_list_options (file) 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, _(" --dll-search-prefix=<string> When linking dynamically to a dll without an\n\ - importlib, use <string><basename>.dll \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, _(" --enable-auto-import Do sophistcated linking of _sym to \n\ + fprintf (file, _(" --enable-auto-import Do sophistcated linking of _sym to\n\ __imp_sym for DATA references\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")); + fprintf (file, _(" --disable-runtime-pseudo-reloc Do not add runtime pseudo-relocations for\n\ + auto-imported DATA.\n")); fprintf (file, _(" --enable-extra-pe-debug Enable verbose debug output when building\n\ or linking to DLLs (esp. auto-import)\n")); #endif } + static void -set_pe_name (name, val) - char *name; - long val; +set_pe_name (char *name, long val) { int i; - /* Find the name and set it. */ + + /* Find the name and set it. */ for (i = 0; init[i].ptr; i++) { if (strcmp (name, init[i].symbol) == 0) @@ -373,12 +353,12 @@ set_pe_name (name, val) return; } } - abort(); + abort (); } static void -set_pe_subsystem () +set_pe_subsystem (void) { const char *sver; int len; @@ -451,7 +431,7 @@ set_pe_subsystem () entry = alc_entry; } - lang_add_entry (entry, 0); + lang_add_entry (entry, TRUE); return; } @@ -461,11 +441,8 @@ set_pe_subsystem () } - static void -set_pe_value (name) - char *name; - +set_pe_value (char *name) { char *end; @@ -477,10 +454,9 @@ set_pe_value (name) optarg = end; } + static void -set_pe_stack_heap (resname, comname) - char *resname; - char *comname; +set_pe_stack_heap (char *resname, char *comname) { set_pe_value (resname); @@ -494,38 +470,16 @@ set_pe_stack_heap (resname, comname) } - -static int -gld_${EMULATION_NAME}_parse_args(argc, argv) - int argc; - char **argv; +static bfd_boolean +gld${EMULATION_NAME}_handle_option (int optc) { - int longind; - int optc; - int prevoptind = optind; - int prevopterr = opterr; - int wanterror; - static int lastoptind = -1; - - if (lastoptind != optind) - opterr = 0; - wanterror = opterr; - - lastoptind = optind; - - optc = getopt_long_only (argc, argv, "-", longopts, &longind); - opterr = prevopterr; - switch (optc) { default: - if (wanterror) - xexit (1); - optind = prevoptind; - return 0; + return FALSE; case OPTION_BASE_FILE: - link_info.base_file = (PTR) fopen (optarg, FOPEN_WB); + link_info.base_file = fopen (optarg, FOPEN_WB); if (link_info.base_file == NULL) { /* xgettext:c-format */ @@ -535,7 +489,7 @@ gld_${EMULATION_NAME}_parse_args(argc, argv) } break; - /* PE options */ + /* PE options. */ case OPTION_HEAP: set_pe_stack_heap ("__size_of_heap_reserve__", "__size_of_heap_commit__"); break; @@ -622,7 +576,7 @@ gld_${EMULATION_NAME}_parse_args(argc, argv) pe_enable_auto_image_base = 0; break; case OPTION_DLL_SEARCH_PREFIX: - pe_dll_search_prefix = xstrdup( optarg ); + pe_dll_search_prefix = xstrdup (optarg); break; case OPTION_NO_DEFAULT_EXCLUDES: pe_dll_do_default_excludes = 0; @@ -633,12 +587,18 @@ gld_${EMULATION_NAME}_parse_args(argc, argv) case OPTION_DLL_DISABLE_AUTO_IMPORT: link_info.pei386_auto_import = 0; break; + case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC: + link_info.pei386_runtime_pseudo_reloc = 1; + break; + case OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC: + link_info.pei386_runtime_pseudo_reloc = 0; + break; case OPTION_ENABLE_EXTRA_PE_DEBUG: pe_dll_extra_pe_debug = 1; break; #endif } - return 1; + return TRUE; } @@ -666,7 +626,8 @@ strhash (const char *str) return hash; } -/* Use the output file to create a image base for relocatable DLLs. */ +/* Use the output file to create a image base for relocatable DLLs. */ + static unsigned long compute_dll_image_base (const char *ofile) { @@ -679,16 +640,16 @@ compute_dll_image_base (const char *ofile) read. */ static void -gld_${EMULATION_NAME}_set_symbols () +gld_${EMULATION_NAME}_set_symbols (void) { /* Run through and invent symbols for all the - names and insert the defaults. */ + names and insert the defaults. */ int j; lang_statement_list_type *save; if (!init[IMAGEBASEOFF].inited) { - if (link_info.relocateable) + if (link_info.relocatable) init[IMAGEBASEOFF].value = 0; else if (init[DLLOFF].value || link_info.shared) #ifdef DLL_SUPPORT @@ -701,11 +662,11 @@ gld_${EMULATION_NAME}_set_symbols () init[IMAGEBASEOFF].value = NT_EXE_IMAGE_BASE; } - /* Don't do any symbol assignments if this is a relocateable link. */ - if (link_info.relocateable) + /* Don't do any symbol assignments if this is a relocatable link. */ + if (link_info.relocatable) return; - /* Glue the assignments into the abs section */ + /* Glue the assignments into the abs section. */ save = stat_ptr; stat_ptr = &(abs_output_section->children); @@ -716,20 +677,20 @@ gld_${EMULATION_NAME}_set_symbols () lang_assignment_statement_type *rv; rv = lang_add_assignment (exp_assop ('=', init[j].symbol, exp_intop (val))); - if (init[j].size == sizeof(short)) - *(short *)init[j].ptr = val; - else if (init[j].size == sizeof(int)) - *(int *)init[j].ptr = val; - else if (init[j].size == sizeof(long)) - *(long *)init[j].ptr = val; + if (init[j].size == sizeof (short)) + *(short *) init[j].ptr = val; + else if (init[j].size == sizeof (int)) + *(int *) init[j].ptr = val; + else if (init[j].size == sizeof (long)) + *(long *) init[j].ptr = val; /* This might be a long long or other special type. */ - else if (init[j].size == sizeof(bfd_vma)) - *(bfd_vma *)init[j].ptr = val; - else abort(); + else if (init[j].size == sizeof (bfd_vma)) + *(bfd_vma *) init[j].ptr = val; + else abort (); if (j == IMAGEBASEOFF) image_base_statement = rv; } - /* Restore the pointer. */ + /* Restore the pointer. */ stat_ptr = save; if (pe.FileAlignment > @@ -743,7 +704,7 @@ gld_${EMULATION_NAME}_set_symbols () have been read. */ static void -gld_${EMULATION_NAME}_after_parse () +gld_${EMULATION_NAME}_after_parse (void) { /* The Windows libraries are designed for the linker to treat the entry point as an undefined symbol. Otherwise, the .obj that @@ -758,7 +719,7 @@ gld_${EMULATION_NAME}_after_parse () opened, so registering the symbol as undefined will make a difference. */ - if (! link_info.relocateable && entry_symbol.name != NULL) + if (! link_info.relocatable && entry_symbol.name != NULL) ldlang_add_undef (entry_symbol.name); } @@ -772,222 +733,212 @@ char * pe_data_import_dll; #ifdef DLL_SUPPORT static struct bfd_link_hash_entry *pe_undef_found_sym; -static boolean -pe_undef_cdecl_match (h, string) - struct bfd_link_hash_entry *h; - PTR string; +static bfd_boolean +pe_undef_cdecl_match (struct bfd_link_hash_entry *h, void *inf) { int sl; - sl = strlen (string); /* silence compiler warning */ + char *string = inf; + + sl = strlen (string); if (h->type == bfd_link_hash_defined && strncmp (h->root.string, string, sl) == 0 && h->root.string[sl] == '@') { pe_undef_found_sym = h; - return false; + return FALSE; } - return true; + return TRUE; } static void -pe_fixup_stdcalls () +pe_fixup_stdcalls (void) { static int gave_warning_message = 0; struct bfd_link_hash_entry *undef, *sym; - char *at; + if (pe_dll_extra_pe_debug) - { - printf ("%s\n", __FUNCTION__); - } + printf ("%s\n", __FUNCTION__); - for (undef = link_info.hash->undefs; undef; undef=undef->next) + for (undef = link_info.hash->undefs; undef; undef=undef->und_next) if (undef->type == bfd_link_hash_undefined) - { - at = strchr (undef->root.string, '@'); - if (at) { - /* The symbol is a stdcall symbol, so let's look for a cdecl - symbol with the same name and resolve to that */ - char *cname = xstrdup (undef->root.string); - at = strchr (cname, '@'); - *at = 0; - sym = bfd_link_hash_lookup (link_info.hash, cname, 0, 0, 1); - if (sym && sym->type == bfd_link_hash_defined) - { - undef->type = bfd_link_hash_defined; - undef->u.def.value = sym->u.def.value; - undef->u.def.section = sym->u.def.section; - if (pe_enable_stdcall_fixup == -1) - { - einfo (_("Warning: resolving %s by linking to %s\n"), - undef->root.string, cname); - if (! gave_warning_message) - { - gave_warning_message = 1; - einfo(_("Use --enable-stdcall-fixup to disable these warnings\n")); - einfo(_("Use --disable-stdcall-fixup to disable these fixups\n")); - } - } - } - } - else - { - /* The symbol is a cdecl symbol, so we look for stdcall - symbols - which means scanning the whole symbol table */ - pe_undef_found_sym = 0; - bfd_link_hash_traverse (link_info.hash, pe_undef_cdecl_match, - (PTR) undef->root.string); - sym = pe_undef_found_sym; - if (sym) - { - undef->type = bfd_link_hash_defined; - undef->u.def.value = sym->u.def.value; - undef->u.def.section = sym->u.def.section; - if (pe_enable_stdcall_fixup == -1) - { - einfo (_("Warning: resolving %s by linking to %s\n"), - undef->root.string, sym->root.string); - if (! gave_warning_message) - { - gave_warning_message = 1; - einfo(_("Use --enable-stdcall-fixup to disable these warnings\n")); - einfo(_("Use --disable-stdcall-fixup to disable these fixups\n")); - } - } - } + char* at = strchr (undef->root.string, '@'); + int lead_at = (*undef->root.string == '@'); + /* For now, don't try to fixup fastcall symbols. */ + + if (at && !lead_at) + { + /* The symbol is a stdcall symbol, so let's look for a + cdecl symbol with the same name and resolve to that. */ + char *cname = xstrdup (undef->root.string /* + lead_at */); + at = strchr (cname, '@'); + *at = 0; + sym = bfd_link_hash_lookup (link_info.hash, cname, 0, 0, 1); + + if (sym && sym->type == bfd_link_hash_defined) + { + undef->type = bfd_link_hash_defined; + undef->u.def.value = sym->u.def.value; + undef->u.def.section = sym->u.def.section; + + if (pe_enable_stdcall_fixup == -1) + { + einfo (_("Warning: resolving %s by linking to %s\n"), + undef->root.string, cname); + if (! gave_warning_message) + { + gave_warning_message = 1; + einfo (_("Use --enable-stdcall-fixup to disable these warnings\n")); + einfo (_("Use --disable-stdcall-fixup to disable these fixups\n")); + } + } + } + } + else + { + /* The symbol is a cdecl symbol, so we look for stdcall + symbols - which means scanning the whole symbol table. */ + pe_undef_found_sym = 0; + bfd_link_hash_traverse (link_info.hash, pe_undef_cdecl_match, + (char *) undef->root.string); + sym = pe_undef_found_sym; + if (sym) + { + undef->type = bfd_link_hash_defined; + undef->u.def.value = sym->u.def.value; + undef->u.def.section = sym->u.def.section; + + if (pe_enable_stdcall_fixup == -1) + { + einfo (_("Warning: resolving %s by linking to %s\n"), + undef->root.string, sym->root.string); + if (! gave_warning_message) + { + gave_warning_message = 1; + einfo (_("Use --enable-stdcall-fixup to disable these warnings\n")); + einfo (_("Use --disable-stdcall-fixup to disable these fixups\n")); + } + } + } + } } - } } static int -make_import_fixup (rel, s) - arelent *rel; - asection *s; +make_import_fixup (arelent *rel, asection *s) { - struct symbol_cache_entry *sym = *rel->sym_ptr_ptr; + struct bfd_symbol *sym = *rel->sym_ptr_ptr; + int addend = 0; if (pe_dll_extra_pe_debug) - { - printf ("arelent: %s@%#lx: add=%li\n", sym->name, - (long) rel->address, (long) rel->addend); - } + printf ("arelent: %s@%#lx: add=%li\n", sym->name, + (long) rel->address, (long) rel->addend); - { - int addend = 0; - if (!bfd_get_section_contents(s->owner, s, &addend, rel->address, sizeof(addend))) - { - einfo (_("%C: Cannot get section contents - auto-import exception\n"), - s->owner, s, rel->address); - } + if (! bfd_get_section_contents (s->owner, s, &addend, rel->address, sizeof (addend))) + einfo (_("%C: Cannot get section contents - auto-import exception\n"), + s->owner, s, rel->address); - if (addend == 0) - pe_create_import_fixup (rel); - else - { - 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"); - } - } + pe_create_import_fixup (rel, s, addend); return 1; } static void -pe_find_data_imports () +pe_find_data_imports (void) { struct bfd_link_hash_entry *undef, *sym; - for (undef = link_info.hash->undefs; undef; undef=undef->next) + + if (link_info.pei386_auto_import == 0) + return; + + for (undef = link_info.hash->undefs; undef; undef=undef->und_next) { if (undef->type == bfd_link_hash_undefined) { - /* C++ symbols are *long* */ + /* C++ symbols are *long*. */ char buf[4096]; - if (pe_dll_extra_pe_debug) - { - printf ("%s:%s\n", __FUNCTION__, undef->root.string); - } + + if (pe_dll_extra_pe_debug) + printf ("%s:%s\n", __FUNCTION__, undef->root.string); + 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) { - if (link_info.pei386_auto_import == -1) - info_msg (_("Info: resolving %s by linking to %s (auto-import)\n"), - undef->root.string, buf); - { - bfd *b = sym->u.def.section->owner; - asymbol **symbols; - int nsyms, symsize, i; - - symsize = bfd_get_symtab_upper_bound (b); - symbols = (asymbol **) xmalloc (symsize); - nsyms = bfd_canonicalize_symtab (b, symbols); - - for (i = 0; i < nsyms; i++) - { - if (memcmp(symbols[i]->name, "__head_", - sizeof ("__head_") - 1)) - continue; - if (pe_dll_extra_pe_debug) - { - printf ("->%s\n", symbols[i]->name); - } - pe_data_import_dll = (char*) (symbols[i]->name + - sizeof ("__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; + bfd *b = sym->u.def.section->owner; + asymbol **symbols; + int nsyms, symsize, i; + + if (link_info.pei386_auto_import == -1) + info_msg (_("Info: resolving %s by linking to %s (auto-import)\n"), + undef->root.string, buf); + + symsize = bfd_get_symtab_upper_bound (b); + symbols = (asymbol **) xmalloc (symsize); + nsyms = bfd_canonicalize_symtab (b, symbols); + + for (i = 0; i < nsyms; i++) + { + if (memcmp (symbols[i]->name, "__head_", + sizeof ("__head_") - 1)) + continue; + + if (pe_dll_extra_pe_debug) + printf ("->%s\n", symbols[i]->name); + + pe_data_import_dll = (char*) (symbols[i]->name + + sizeof ("__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; } } } } -#endif /* DLL_SUPPORT */ -static boolean -pr_sym (h, string) - struct bfd_hash_entry *h; - PTR string ATTRIBUTE_UNUSED; +static bfd_boolean +pr_sym (struct bfd_hash_entry *h, void *inf ATTRIBUTE_UNUSED) { if (pe_dll_extra_pe_debug) - { - printf("+%s\n",h->string); - } - return true; + printf ("+%s\n", h->string); + + return TRUE; } +#endif /* DLL_SUPPORT */ static void -gld_${EMULATION_NAME}_after_open () +gld_${EMULATION_NAME}_after_open (void) { - +#ifdef DLL_SUPPORT if (pe_dll_extra_pe_debug) { bfd *a; struct bfd_link_hash_entry *sym; + printf ("%s()\n", __FUNCTION__); - for (sym = link_info.hash->undefs; sym; sym=sym->next) + for (sym = link_info.hash->undefs; sym; sym=sym->und_next) printf ("-%s\n", sym->root.string); - bfd_hash_traverse (&link_info.hash->table, pr_sym,NULL); + 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",a->filename); } +#endif /* Pass the wacky PE command line options into the output bfd. FIXME: This should be done via a function, rather than by @@ -1003,10 +954,15 @@ gld_${EMULATION_NAME}_after_open () if (pe_enable_stdcall_fixup) /* -1=warn or 1=disable */ pe_fixup_stdcalls (); + pe_process_import_defs (output_bfd, & link_info); + pe_find_data_imports (); - pe_process_import_defs(output_bfd, &link_info); +#if ! (defined (TARGET_IS_i386pe) || defined (TARGET_IS_armpe)) if (link_info.shared) +#else + if (!link_info.relocatable) +#endif pe_dll_build_sections (output_bfd, &link_info); #ifndef TARGET_IS_i386pe @@ -1046,7 +1002,7 @@ gld_${EMULATION_NAME}_after_open () head/tail objects, causing an improper import table. We detect those cases and rename the "other" import libraries to match the one the head/tail come from, so that the linker will sort - things nicely and produce a valid import table. */ + things nicely and produce a valid import table. */ LANG_FOR_EACH_INPUT_STATEMENT (is) { @@ -1105,7 +1061,7 @@ gld_${EMULATION_NAME}_after_open () for (i = 0; i < nrelocs; i++) { - struct symbol_cache_entry *s; + struct bfd_symbol *s; struct bfd_link_hash_entry * blhe; bfd *other_bfd; char *n; @@ -1118,7 +1074,7 @@ gld_${EMULATION_NAME}_after_open () /* Thunk section with reloc to another bfd. */ blhe = bfd_link_hash_lookup (link_info.hash, s->name, - false, false, true); + FALSE, FALSE, TRUE); if (blhe == NULL || blhe->type != bfd_link_hash_defined) @@ -1151,6 +1107,7 @@ gld_${EMULATION_NAME}_after_open () int is_ms_arch = 0; bfd *cur_arch = 0; lang_input_statement_type *is2; + lang_input_statement_type *is3; /* Careful - this is a shell script. Watch those dollar signs! */ /* Microsoft import libraries have every member named the same, @@ -1165,21 +1122,59 @@ gld_${EMULATION_NAME}_after_open () { if (is->the_bfd->my_archive) { + char *pnt; bfd *arch = is->the_bfd->my_archive; + if (cur_arch != arch) { cur_arch = arch; is_ms_arch = 1; - for (is2 = is; - is2 && is2->the_bfd->my_archive == arch; - is2 = (lang_input_statement_type *)is2->next) + + for (is3 = is; + is3 && is3->the_bfd->my_archive == arch; + is3 = (lang_input_statement_type *) is3->next) + { + /* A MS dynamic import library can also contain static + 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, '.'); + if (pnt != NULL && strcmp (pnt, ".dll") == 0) + break; + } + + if (is3 == NULL) + is_ms_arch = 0; + else { - if (strcmp (is->the_bfd->filename, is2->the_bfd->filename)) - is_ms_arch = 0; + /* OK, found one. Now look to see if the remaining + (dynamic import) members use the same name. */ + for (is2 = is; + is2 && is2->the_bfd->my_archive == arch; + is2 = (lang_input_statement_type *) is2->next) + { + /* Skip static members, ie anything with a .obj + extension. */ + pnt = strrchr (is2->the_bfd->filename, '.'); + if (pnt != NULL && strcmp (pnt, ".obj") == 0) + continue; + + if (strcmp (is3->the_bfd->filename, + is2->the_bfd->filename)) + { + is_ms_arch = 0; + break; + } + } } } - if (is_ms_arch) + /* 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, '.'); + + if (is_ms_arch && (strcmp (pnt, ".dll") == 0)) { int idata2 = 0, reloc_count=0; asection *sec; @@ -1213,10 +1208,10 @@ gld_${EMULATION_NAME}_after_open () } static void -gld_${EMULATION_NAME}_before_allocation() +gld_${EMULATION_NAME}_before_allocation (void) { #ifdef TARGET_IS_ppcpe - /* Here we rummage through the found bfds to collect toc information */ + /* Here we rummage through the found bfds to collect toc information. */ { LANG_FOR_EACH_INPUT_STATEMENT (is) { @@ -1228,7 +1223,7 @@ 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. */ ppc_allocate_toc_section (&link_info); #endif /* TARGET_IS_ppcpe */ @@ -1238,7 +1233,7 @@ gld_${EMULATION_NAME}_before_allocation() Here we rummage through the found bfds to collect glue information. FIXME: should this be based on a command line - option? krk@cygnus.com */ + option? krk@cygnus.com. */ { LANG_FOR_EACH_INPUT_STATEMENT (is) { @@ -1252,114 +1247,118 @@ 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_pe_allocate_interworking_sections (& link_info); #endif /* TARGET_IS_armpe */ } #ifdef DLL_SUPPORT /* This is called when an input file isn't recognized as a BFD. We - check here for .DEF files and pull them in automatically. */ + check here for .DEF files and pull them in automatically. */ static int -saw_option(char *option) +saw_option (char *option) { int i; - for (i=0; init[i].ptr; i++) + + for (i = 0; init[i].ptr; i++) if (strcmp (init[i].symbol, option) == 0) return init[i].inited; return 0; } #endif /* DLL_SUPPORT */ -static boolean -gld_${EMULATION_NAME}_unrecognized_file(entry) - lang_input_statement_type *entry ATTRIBUTE_UNUSED; +static bfd_boolean +gld_${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED) { #ifdef DLL_SUPPORT const char *ext = entry->filename + strlen (entry->filename) - 4; if (strcmp (ext, ".def") == 0 || strcmp (ext, ".DEF") == 0) - { - if (pe_def_file == 0) - pe_def_file = def_file_empty (); - def_file_parse (entry->filename, pe_def_file); - if (pe_def_file) { - int i, buflen=0, len; - char *buf; - for (i=0; i<pe_def_file->num_exports; i++) - { - len = strlen(pe_def_file->exports[i].internal_name); - if (buflen < len+2) - buflen = len+2; - } - buf = (char *) xmalloc (buflen); - for (i=0; i<pe_def_file->num_exports; i++) + if (pe_def_file == 0) + pe_def_file = def_file_empty (); + + def_file_parse (entry->filename, pe_def_file); + + if (pe_def_file) { - struct bfd_link_hash_entry *h; - sprintf(buf, "_%s", pe_def_file->exports[i].internal_name); + int i, buflen=0, len; + char *buf; - 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")); - if (h->type == bfd_link_hash_new) + for (i = 0; i < pe_def_file->num_exports; i++) { - h->type = bfd_link_hash_undefined; - h->u.undef.abfd = NULL; - bfd_link_add_undef (link_info.hash, h); + len = strlen (pe_def_file->exports[i].internal_name); + if (buflen < len + 2) + buflen = len + 2; } - } - free (buf); - /* def_file_print (stdout, pe_def_file); */ - if (pe_def_file->is_dll == 1) - link_info.shared = 1; + buf = (char *) xmalloc (buflen); - if (pe_def_file->base_address != (bfd_vma)(-1)) - { - pe.ImageBase = - pe_data (output_bfd)->pe_opthdr.ImageBase = - init[IMAGEBASEOFF].value = pe_def_file->base_address; - init[IMAGEBASEOFF].inited = 1; - if (image_base_statement) - image_base_statement->exp = - exp_assop ('=', "__image_base__", exp_intop (pe.ImageBase)); - } + for (i = 0; i < pe_def_file->num_exports; i++) + { + struct bfd_link_hash_entry *h; + + sprintf (buf, "_%s", pe_def_file->exports[i].internal_name); + + 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")); + if (h->type == bfd_link_hash_new) + { + h->type = bfd_link_hash_undefined; + h->u.undef.abfd = NULL; + bfd_link_add_undef (link_info.hash, h); + } + } + free (buf); + + /* def_file_print (stdout, pe_def_file); */ + if (pe_def_file->is_dll == 1) + link_info.shared = 1; + + if (pe_def_file->base_address != (bfd_vma)(-1)) + { + pe.ImageBase = + pe_data (output_bfd)->pe_opthdr.ImageBase = + init[IMAGEBASEOFF].value = pe_def_file->base_address; + init[IMAGEBASEOFF].inited = 1; + if (image_base_statement) + image_base_statement->exp = + exp_assop ('=', "__image_base__", exp_intop (pe.ImageBase)); + } #if 0 - /* Not sure if these *should* be set */ - if (pe_def_file->version_major != -1) - { - pe.MajorImageVersion = pe_def_file->version_major; - pe.MinorImageVersion = pe_def_file->version_minor; - } + /* Not sure if these *should* be set. */ + if (pe_def_file->version_major != -1) + { + pe.MajorImageVersion = pe_def_file->version_major; + pe.MinorImageVersion = pe_def_file->version_minor; + } #endif - if (pe_def_file->stack_reserve != -1 - && ! saw_option ("__size_of_stack_reserve__")) - { - pe.SizeOfStackReserve = pe_def_file->stack_reserve; - if (pe_def_file->stack_commit != -1) - pe.SizeOfStackCommit = pe_def_file->stack_commit; - } - if (pe_def_file->heap_reserve != -1 - && ! saw_option ("__size_of_heap_reserve__")) - { - pe.SizeOfHeapReserve = pe_def_file->heap_reserve; - if (pe_def_file->heap_commit != -1) - pe.SizeOfHeapCommit = pe_def_file->heap_commit; - } - return true; + if (pe_def_file->stack_reserve != -1 + && ! saw_option ("__size_of_stack_reserve__")) + { + pe.SizeOfStackReserve = pe_def_file->stack_reserve; + if (pe_def_file->stack_commit != -1) + pe.SizeOfStackCommit = pe_def_file->stack_commit; + } + if (pe_def_file->heap_reserve != -1 + && ! saw_option ("__size_of_heap_reserve__")) + { + pe.SizeOfHeapReserve = pe_def_file->heap_reserve; + if (pe_def_file->heap_commit != -1) + pe.SizeOfHeapCommit = pe_def_file->heap_commit; + } + return TRUE; + } } - } #endif - return false; - + return FALSE; } -static boolean -gld_${EMULATION_NAME}_recognized_file(entry) - lang_input_statement_type *entry ATTRIBUTE_UNUSED; +static bfd_boolean +gld_${EMULATION_NAME}_recognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED) { #ifdef DLL_SUPPORT #ifdef TARGET_IS_i386pe @@ -1376,23 +1375,31 @@ gld_${EMULATION_NAME}_recognized_file(entry) #endif if (bfd_get_format (entry->the_bfd) == bfd_object) { - const char *ext = entry->filename + strlen (entry->filename) - 4; + char fbuf[LD_PATHMAX + 1]; + const char *ext; + + if (REALPATH (entry->filename, fbuf) == NULL) + strncpy (fbuf, entry->filename, sizeof (fbuf)); + + ext = fbuf + strlen (fbuf) - 4; + if (strcmp (ext, ".dll") == 0 || strcmp (ext, ".DLL") == 0) - return pe_implied_import_dll (entry->filename); + return pe_implied_import_dll (fbuf); } #endif - return false; + return FALSE; } static void -gld_${EMULATION_NAME}_finish () +gld_${EMULATION_NAME}_finish (void) { #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) struct bfd_link_hash_entry * h; if (thumb_entry_symbol != NULL) { - h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol, false, false, true); + h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol, + FALSE, FALSE, TRUE); if (h != (struct bfd_link_hash_entry *) NULL && (h->type == bfd_link_hash_defined @@ -1429,7 +1436,11 @@ gld_${EMULATION_NAME}_finish () #endif /* defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) */ #ifdef DLL_SUPPORT - if (link_info.shared) + if (link_info.shared +#if !defined(TARGET_IS_shpe) && !defined(TARGET_IS_mipspe) + || (!link_info.relocatable && pe_def_file->num_exports != 0) +#endif + ) { pe_dll_fill_sections (output_bfd, &link_info); if (pe_implib_filename) @@ -1447,9 +1458,10 @@ gld_${EMULATION_NAME}_finish () pe_dll_generate_def_file (pe_out_def_filename); #endif /* DLL_SUPPORT */ - /* I don't know where .idata gets set as code, but it shouldn't be */ + /* I don't know where .idata gets set as code, but it shouldn't be. */ { asection *asec = bfd_get_section_by_name (output_bfd, ".idata"); + if (asec) { asec->flags &= ~SEC_CODE; @@ -1463,8 +1475,7 @@ gld_${EMULATION_NAME}_finish () Used by place_orphan. */ static asection * -output_prev_sec_find (os) - lang_output_section_statement_type *os; +output_prev_sec_find (lang_output_section_statement_type *os) { asection *s = (asection *) NULL; lang_statement_union_type *u; @@ -1505,11 +1516,8 @@ struct orphan_save lang_statement_union_type **stmt; }; -/*ARGSUSED*/ -static boolean -gld_${EMULATION_NAME}_place_orphan (file, s) - lang_input_statement_type *file; - asection *s; +static bfd_boolean +gld_${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s) { const char *secname; char *hold_section_name; @@ -1521,9 +1529,8 @@ gld_${EMULATION_NAME}_place_orphan (file, s) secname = bfd_get_section_name (s->owner, s); /* Look through the script to see where to place this section. */ - hold_section_name = xstrdup (secname); - if (!link_info.relocateable) + if (!link_info.relocatable) { dollar = strchr (hold_section_name, '$'); if (dollar != NULL) @@ -1614,7 +1621,7 @@ gld_${EMULATION_NAME}_place_orphan (file, s) /* If the name of the section is representable in C, then create symbols to mark the start and the end of the section. */ for (ps = outsecname; *ps != '\0'; ps++) - if (! isalnum ((unsigned char) *ps) && *ps != '_') + if (! ISALNUM ((unsigned char) *ps) && *ps != '_') break; if (*ps == '\0') { @@ -1629,7 +1636,7 @@ gld_${EMULATION_NAME}_place_orphan (file, s) } } - if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0) + if (link_info.relocatable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0) address = exp_intop ((bfd_vma) 0); else { @@ -1640,7 +1647,6 @@ gld_${EMULATION_NAME}_place_orphan (file, s) } os = lang_enter_output_section_statement (outsecname, address, 0, - (bfd_vma) 0, (etree_type *) NULL, (etree_type *) NULL, (etree_type *) NULL); @@ -1655,8 +1661,8 @@ gld_${EMULATION_NAME}_place_orphan (file, s) { char *symname; - /* lang_leave_ouput_section_statement resets stat_ptr. Put - stat_ptr back where we want it. */ + /* lang_leave_ouput_section_statement resets stat_ptr. + Put stat_ptr back where we want it. */ if (place != NULL) stat_ptr = &add; @@ -1748,12 +1754,11 @@ gld_${EMULATION_NAME}_place_orphan (file, s) if (dollar != NULL) { - boolean found_dollar; + bfd_boolean found_dollar; /* The section name has a '$'. Sort it with the other '$' sections. */ - - found_dollar = false; + found_dollar = FALSE; for ( ; *pl != NULL; pl = &(*pl)->header.next) { lang_input_section_type *ls; @@ -1772,7 +1777,7 @@ gld_${EMULATION_NAME}_place_orphan (file, s) } else { - found_dollar = true; + found_dollar = TRUE; if (strcmp (secname, lname) < 0) break; } @@ -1788,20 +1793,19 @@ gld_${EMULATION_NAME}_place_orphan (file, s) free (hold_section_name); - return true; + return TRUE; } -static boolean -gld_${EMULATION_NAME}_open_dynamic_archive (arch, search, entry) - const char * arch ATTRIBUTE_UNUSED; - search_dirs_type * search; - lang_input_statement_type * entry; +static bfd_boolean +gld_${EMULATION_NAME}_open_dynamic_archive + (const char *arch ATTRIBUTE_UNUSED, search_dirs_type *search, + lang_input_statement_type *entry) { const char * filename; char * string; if (! entry->is_archive) - return false; + return FALSE; filename = entry->filename; @@ -1813,65 +1817,63 @@ gld_${EMULATION_NAME}_open_dynamic_archive (arch, search, entry) #endif + 1); - /* Try "libfoo.dll.a" first (preferred explicit import library for dll's */ + /* Try "libfoo.dll.a" first (preferred explicit import library for dll's. */ sprintf (string, "%s/lib%s.dll.a", search->name, filename); if (! ldfile_try_open_bfd (string, entry)) { - /* Try "foo.dll.a" next (alternate explicit import library for dll's */ + /* Try "foo.dll.a" next (alternate explicit import library for dll's. */ sprintf (string, "%s/%s.dll.a", search->name, filename); if (! ldfile_try_open_bfd (string, entry)) { -/* - Try libfoo.a next. Normally, this would be interpreted as a static - library, but it *could* be an import library. For backwards compatibility, - libfoo.a needs to ==precede== libfoo.dll and foo.dll in the search, - or sometimes errors occur when building legacy packages. - - Putting libfoo.a here means that in a failure case (i.e. the library - -lfoo is not found) we will search for libfoo.a twice before - giving up -- once here, and once when searching for a "static" lib. - for a "static" lib. -*/ + /* Try libfoo.a next. Normally, this would be interpreted as a static + library, but it *could* be an import library. For backwards compatibility, + libfoo.a needs to ==precede== libfoo.dll and foo.dll in the search, + or sometimes errors occur when building legacy packages. + + Putting libfoo.a here means that in a failure case (i.e. the library + -lfoo is not found) we will search for libfoo.a twice before + giving up -- once here, and once when searching for a "static" lib. + for a "static" lib. */ /* Try "libfoo.a" (import lib, or static lib, but must - take precedence over dll's) */ + take precedence over dll's). */ sprintf (string, "%s/lib%s.a", search->name, filename); if (! ldfile_try_open_bfd (string, entry)) { #ifdef DLL_SUPPORT if (pe_dll_search_prefix) { - /* Try "<prefix>foo.dll" (preferred dll name, if specified) */ + /* Try "<prefix>foo.dll" (preferred dll name, if specified). */ sprintf (string, "%s/%s%s.dll", search->name, pe_dll_search_prefix, filename); if (! ldfile_try_open_bfd (string, entry)) { - /* Try "libfoo.dll" (default preferred dll name) */ + /* Try "libfoo.dll" (default preferred dll name). */ sprintf (string, "%s/lib%s.dll", search->name, filename); if (! ldfile_try_open_bfd (string, entry)) { - /* Finally, try "foo.dll" (alternate dll name) */ + /* Finally, try "foo.dll" (alternate dll name). */ sprintf (string, "%s/%s.dll", search->name, filename); if (! ldfile_try_open_bfd (string, entry)) { free (string); - return false; + return FALSE; } } } } - else /* pe_dll_search_prefix not specified */ + else /* pe_dll_search_prefix not specified. */ #endif { - /* Try "libfoo.dll" (preferred dll name) */ + /* Try "libfoo.dll" (preferred dll name). */ sprintf (string, "%s/lib%s.dll", search->name, filename); if (! ldfile_try_open_bfd (string, entry)) { - /* Finally, try "foo.dll" (alternate dll name) */ + /* Finally, try "foo.dll" (alternate dll name). */ sprintf (string, "%s/%s.dll", search->name, filename); if (! ldfile_try_open_bfd (string, entry)) { free (string); - return false; + return FALSE; } } } @@ -1881,20 +1883,18 @@ gld_${EMULATION_NAME}_open_dynamic_archive (arch, search, entry) entry->filename = string; - return true; + return TRUE; } static int -gld_${EMULATION_NAME}_find_potential_libraries (name, entry) - char * name; - lang_input_statement_type * entry; +gld_${EMULATION_NAME}_find_potential_libraries + (char *name, lang_input_statement_type *entry) { return ldfile_open_file_search (name, entry, "", ".lib"); } static char * -gld_${EMULATION_NAME}_get_script(isfile) - int *isfile; +gld_${EMULATION_NAME}_get_script (int *isfile) EOF # Scripts compiled in. # sed commands to quote an ld script as a C string. @@ -1904,19 +1904,19 @@ cat >>e${EMULATION_NAME}.c <<EOF { *isfile = 0; - if (link_info.relocateable == true && config.build_constructors == true) + if (link_info.relocatable && config.build_constructors) return EOF -sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c -echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c -sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c -echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c -sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c -echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c -sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c -echo ' ; else return' >> e${EMULATION_NAME}.c -sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c -echo '; }' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c +echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c +echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c +echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c +echo ' ; else return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c +echo '; }' >> e${EMULATION_NAME}.c cat >>e${EMULATION_NAME}.c <<EOF @@ -1935,16 +1935,18 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = gld_${EMULATION_NAME}_get_script, "${EMULATION_NAME}", "${OUTPUT_FORMAT}", - gld_${EMULATION_NAME}_finish, /* finish */ - NULL, /* create output section statements */ + gld_${EMULATION_NAME}_finish, + NULL, /* Create output section statements. */ gld_${EMULATION_NAME}_open_dynamic_archive, gld_${EMULATION_NAME}_place_orphan, gld_${EMULATION_NAME}_set_symbols, - gld_${EMULATION_NAME}_parse_args, + NULL, /* parse_args */ + gld${EMULATION_NAME}_add_options, + gld${EMULATION_NAME}_handle_option, gld_${EMULATION_NAME}_unrecognized_file, gld_${EMULATION_NAME}_list_options, gld_${EMULATION_NAME}_recognized_file, gld_${EMULATION_NAME}_find_potential_libraries, - NULL /* new_vers_pattern */ + NULL /* new_vers_pattern. */ }; EOF |