diff options
author | DJ Delorie <dj@redhat.com> | 2000-10-12 19:18:20 +0000 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2000-10-12 19:18:20 +0000 |
commit | 627427debc29d3c6758a637edc47d6b6fa2860fd (patch) | |
tree | ccfbb8856f386b9587051cc42f0a47181f4cda22 /ld/emultempl | |
parent | 9eb01b42f62888ad4a7ffd0fef8c140b93e01919 (diff) | |
download | gdb-627427debc29d3c6758a637edc47d6b6fa2860fd.zip gdb-627427debc29d3c6758a637edc47d6b6fa2860fd.tar.gz 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.em | 53 |
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) */ + } } } |