aboutsummaryrefslogtreecommitdiff
path: root/ld/emultempl
diff options
context:
space:
mode:
authorDJ Delorie <dj@redhat.com>2000-10-12 19:18:20 +0000
committerDJ Delorie <dj@redhat.com>2000-10-12 19:18:20 +0000
commit627427debc29d3c6758a637edc47d6b6fa2860fd (patch)
treeccfbb8856f386b9587051cc42f0a47181f4cda22 /ld/emultempl
parent9eb01b42f62888ad4a7ffd0fef8c140b93e01919 (diff)
downloadfsf-binutils-gdb-627427debc29d3c6758a637edc47d6b6fa2860fd.zip
fsf-binutils-gdb-627427debc29d3c6758a637edc47d6b6fa2860fd.tar.gz
fsf-binutils-gdb-627427debc29d3c6758a637edc47d6b6fa2860fd.tar.bz2
* emultempl/pe.em (pe_dll_search_prefix): New variable,
(longopts): New --dll-search-prefix option. (gld_${EMULATION_NAME}_list_options): Document. (gld_${EMULATION_NAME}_parse_args): Handle. (gld_${EMULATION_NAME}_open_dynamic_archive): When linking dynamically, search for a dll named '<prefix><basename>.dll' in preference to 'lib<basename>.dll' if --dll-search-prefix is specified.
Diffstat (limited to 'ld/emultempl')
-rw-r--r--ld/emultempl/pe.em53
1 files changed, 44 insertions, 9 deletions
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em
index 78a72d7..02d2bf4 100644
--- a/ld/emultempl/pe.em
+++ b/ld/emultempl/pe.em
@@ -119,6 +119,7 @@ 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;
+static char *pe_dll_search_prefix = NULL;
#endif
extern const char *output_filename;
@@ -172,6 +173,7 @@ gld_${EMULATION_NAME}_before_parse()
#define OPTION_IMP_COMPAT (OPTION_WARN_DUPLICATE_EXPORTS + 1)
#define OPTION_ENABLE_AUTO_IMAGE_BASE (OPTION_IMP_COMPAT + 1)
#define OPTION_DISABLE_AUTO_IMAGE_BASE (OPTION_ENABLE_AUTO_IMAGE_BASE + 1)
+#define OPTION_DLL_SEARCH_PREFIX (OPTION_DISABLE_AUTO_IMAGE_BASE + 1)
static struct option longopts[] =
{
@@ -208,6 +210,7 @@ static struct option longopts[] =
{"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},
#endif
{NULL, no_argument, NULL, 0}
};
@@ -290,6 +293,9 @@ gld_${EMULATION_NAME}_list_options (file)
fprintf (file, _(" --enable-auto-image-base Automatically choose image base for DLLs\n"));
fprintf (file, _(" 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 witout an\n"));
+ fprintf (file, _(" importlib, use <string><basename>.dll \n"));
+ fprintf (file, _(" in preference to lib<basename>.dll \n"));
#endif
}
@@ -554,6 +560,9 @@ gld_${EMULATION_NAME}_parse_args(argc, argv)
case OPTION_DISABLE_AUTO_IMAGE_BASE:
pe_enable_auto_image_base = 0;
break;
+ case OPTION_DLL_SEARCH_PREFIX:
+ pe_dll_search_prefix = xstrdup( optarg );
+ break;
#endif
}
return 1;
@@ -1452,6 +1461,7 @@ gld_${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
string = (char *) xmalloc (strlen (search->name)
+ strlen (filename)
+ sizeof "/lib.a.dll"
+ + ( pe_dll_search_prefix ? strlen (pe_dll_search_prefix) : 0 )
+ 1);
/* Try "libfoo.dll.a" first (preferred explicit import library for dll's */
@@ -1478,19 +1488,44 @@ gld_${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
take precedence over dll's) */
sprintf (string, "%s/lib%s.a", search->name, filename);
if (! ldfile_try_open_bfd (string, entry))
- {
- /* 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) */
- sprintf (string, "%s/%s.dll", search->name, filename);
+ {
+
+ if ( pe_dll_search_prefix )
+ {
+ /* 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))
{
- free (string);
- return false;
+ /* 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) */
+ sprintf (string, "%s/%s.dll", search->name, filename);
+ if (! ldfile_try_open_bfd (string, entry))
+ {
+ free (string);
+ return false;
+ }
+ }
}
}
+ else /* pe_dll_search_prefix not specified */
+ {
+ /* 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) */
+ sprintf (string, "%s/%s.dll", search->name, filename);
+ if (! ldfile_try_open_bfd (string, entry))
+ {
+ free (string);
+ return false;
+ }
+ }
+ } /* if (pe_dll_search_prefix) */
+
}
}
}