* emultempl/spuelf.em (embedded_spu_file): Deduce embedspu program
authorAlan Modra <amodra@gmail.com>
Mon, 18 Jun 2007 02:23:56 +0000 (02:23 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 18 Jun 2007 02:23:56 +0000 (02:23 +0000)
name prefix from that of ld.

ld/ChangeLog
ld/emultempl/spuelf.em

index a4a3d1760cb17d600572fe442dbde15f550102cd..aaf35f58bd4ce6e8fe3cdc7c4fdd0ee6c40d210e 100644 (file)
@@ -1,3 +1,8 @@
+2007-06-18  Alan Modra  <amodra@bigpond.net.au>
+
+       * emultempl/spuelf.em (embedded_spu_file): Deduce embedspu program
+       name prefix from that of ld.
+
 2007-06-14  H.J. Lu  <hongjiu.lu@intel.com>
 
        * Makefile.am (ACLOCAL_AMFLAGS): Add -I ../config -I ../bfd.
index db0542f8320dd61012f751d0bb4743f5a95a642e..3266f65e21db802ca541f9f327df4d1ecaae0b1e 100644 (file)
@@ -306,6 +306,8 @@ embedded_spu_file (lang_input_statement_type *entry, const char *flags)
   union lang_statement_union **old_file_tail;
   union lang_statement_union *new_ent;
   lang_input_statement_type *search;
+  const char *prefix;
+  size_t prefix_len;
 
   if (entry->the_bfd->format != bfd_object
       || strcmp (entry->the_bfd->xvec->name, "elf32-spu") != 0
@@ -360,7 +362,23 @@ embedded_spu_file (lang_input_statement_type *entry, const char *flags)
 
   /* Use fork() and exec() rather than system() so that we don't
      need to worry about quoting args.  */
-  cmd[0] = "embedspu";
+  prefix = base_name (program_name);
+  prefix_len = strlen (prefix);
+  if (prefix_len > 2
+      && (prefix[prefix_len - 2] == 'l'
+         || prefix[prefix_len - 2] == 'L')
+      && (prefix[prefix_len - 1] == 'd'
+         || prefix[prefix_len - 1] == 'D'))
+    {
+      cmd[0] = xmalloc (prefix_len + 7);
+      memcpy (cmd[0], prefix, prefix_len - 2);
+      memcpy (cmd[0] + prefix_len - 2, "embedspu", 9);
+    }
+  else
+    {
+      prefix_len = 0;
+      cmd[0] = "embedspu";
+    }
   cmd[1] = flags;
   cmd[2] = handle;
   cmd[3] = entry->the_bfd->filename;
@@ -379,6 +397,11 @@ embedded_spu_file (lang_input_statement_type *entry, const char *flags)
   if (pid == 0)
     {
       execvp (cmd[0], (char *const *) cmd);
+      if (prefix_len != 0)
+       {
+         cmd[0] = "embedspu";
+         execvp (cmd[0], (char *const *) cmd);
+       }
       perror (cmd[0]);
       _exit (127);
     }