aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/emultempl/pe.em27
-rw-r--r--ld/emultempl/pep.em27
2 files changed, 44 insertions, 10 deletions
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em
index ad969cc..2706d73 100644
--- a/ld/emultempl/pe.em
+++ b/ld/emultempl/pe.em
@@ -534,6 +534,23 @@ gld${EMULATION_NAME}_list_options (FILE *file)
fprintf (file, _(" --build-id[=STYLE] Generate build ID\n"));
}
+/* A case insensitive comparison, regardless of the host platform, used for
+ comparing file extensions. */
+static int
+fileext_cmp (const char *s1, const char *s2)
+{
+ for (;;)
+ {
+ int c1 = TOLOWER (*s1++);
+ int c2 = *s2++; /* Assumed to be lower case from the caller. */
+
+ if (c1 != c2)
+ return (c1 - c2);
+
+ if (c1 == '\0')
+ return 0;
+ }
+}
static void
set_pe_name (char *name, long val)
@@ -1666,7 +1683,7 @@ gld${EMULATION_NAME}_after_open (void)
extension, and use that for the remainder of the
comparisons. */
pnt = strrchr (bfd_get_filename (is3->the_bfd), '.');
- if (pnt != NULL && filename_cmp (pnt, ".dll") == 0)
+ if (pnt != NULL && fileext_cmp (pnt + 1, "dll") == 0)
break;
}
@@ -1683,7 +1700,7 @@ gld${EMULATION_NAME}_after_open (void)
/* Skip static members, ie anything with a .obj
extension. */
pnt = strrchr (bfd_get_filename (is2->the_bfd), '.');
- if (pnt != NULL && filename_cmp (pnt, ".obj") == 0)
+ if (pnt != NULL && fileext_cmp (pnt + 1, "obj") == 0)
continue;
if (filename_cmp (bfd_get_filename (is3->the_bfd),
@@ -1701,7 +1718,7 @@ gld${EMULATION_NAME}_after_open (void)
then leave the filename alone. */
pnt = strrchr (bfd_get_filename (is->the_bfd), '.');
- if (is_ms_arch && (filename_cmp (pnt, ".dll") == 0))
+ if (is_ms_arch && pnt != NULL && (fileext_cmp (pnt + 1, "dll") == 0))
{
int idata2 = 0, reloc_count=0;
asection *sec;
@@ -1855,9 +1872,9 @@ static bool
gld${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED)
{
#ifdef DLL_SUPPORT
- const char *ext = entry->filename + strlen (entry->filename) - 4;
+ const char *ext = strrchr (entry->filename, '.');
- if (filename_cmp (ext, ".def") == 0 || filename_cmp (ext, ".DEF") == 0)
+ if (ext != NULL && fileext_cmp (ext + 1, "def") == 0)
{
pe_def_file = def_file_parse (entry->filename, pe_def_file);
diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em
index ee36a9a..accefc0 100644
--- a/ld/emultempl/pep.em
+++ b/ld/emultempl/pep.em
@@ -181,6 +181,23 @@ static int is_underscoring (void)
return pep_leading_underscore;
}
+/* A case insensitive comparison, regardless of the host platform, used for
+ comparing file extensions. */
+static int
+fileext_cmp (const char *s1, const char *s2)
+{
+ for (;;)
+ {
+ int c1 = TOLOWER (*s1++);
+ int c2 = *s2++; /* Assumed to be lower case from the caller. */
+
+ if (c1 != c2)
+ return (c1 - c2);
+
+ if (c1 == '\0')
+ return 0;
+ }
+}
static void
gld${EMULATION_NAME}_before_parse (void)
@@ -1630,7 +1647,7 @@ gld${EMULATION_NAME}_after_open (void)
extension, and use that for the remainder of the
comparisons. */
pnt = strrchr (bfd_get_filename (is3->the_bfd), '.');
- if (pnt != NULL && filename_cmp (pnt, ".dll") == 0)
+ if (pnt != NULL && fileext_cmp (pnt + 1, "dll") == 0)
break;
}
@@ -1647,7 +1664,7 @@ gld${EMULATION_NAME}_after_open (void)
/* Skip static members, ie anything with a .obj
extension. */
pnt = strrchr (bfd_get_filename (is2->the_bfd), '.');
- if (pnt != NULL && filename_cmp (pnt, ".obj") == 0)
+ if (pnt != NULL && fileext_cmp (pnt + 1, "obj") == 0)
continue;
if (filename_cmp (bfd_get_filename (is3->the_bfd),
@@ -1665,7 +1682,7 @@ gld${EMULATION_NAME}_after_open (void)
then leave the filename alone. */
pnt = strrchr (bfd_get_filename (is->the_bfd), '.');
- if (is_ms_arch && (filename_cmp (pnt, ".dll") == 0))
+ if (is_ms_arch && pnt != NULL && (fileext_cmp (pnt + 1, "dll") == 0))
{
int idata2 = 0, reloc_count=0;
asection *sec;
@@ -1725,9 +1742,9 @@ static bool
gld${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED)
{
#ifdef DLL_SUPPORT
- const char *ext = entry->filename + strlen (entry->filename) - 4;
+ const char *ext = strrchr (entry->filename, '.');
- if (filename_cmp (ext, ".def") == 0 || filename_cmp (ext, ".DEF") == 0)
+ if (ext != NULL && fileext_cmp (ext + 1, "def") == 0)
{
pep_def_file = def_file_parse (entry->filename, pep_def_file);