static int vflag; /* true if -v */
static int rflag; /* true if -r */
+static int strip_flag; /* true if -s */
static int debug; /* true if -debug */
static char *c_file; /* <xxx>.c for constructor/destructor list. */
static char *o_file; /* <xxx>.o for constructor/destructor list. */
static char *nm_file_name; /* pathname of nm */
+static char *strip_file_name; /* pathname of strip */
static struct head constructors; /* list of constructors found */
static struct head destructors; /* list of destructors found */
signal (SIGSEGV, handler);
signal (SIGBUS, handler);
- /* Try to discover a valid linker/assembler/nm to use. */
+ /* Try to discover a valid linker/assembler/nm/strip to use. */
len = strlen (argv[0]);
prefix = (char *)0;
if (len >= sizeof ("ld")-1)
clen = sizeof (STANDARD_EXEC_PREFIX) - 1;
#endif
+ /* Allocate enough string space for the longest possible pathnames. */
ld_file_name = xcalloc (len + sizeof ("real-ld"), 1);
nm_file_name = xcalloc (len + sizeof ("gnm"), 1);
+ strip_file_name = xcalloc (len + sizeof ("gstrip"), 1);
+ /* Determine the full path name of the ld program to use. */
memcpy (ld_file_name, prefix, len);
strcpy (ld_file_name + len, "real-ld");
if (access (ld_file_name, X_OK) < 0)
#ifdef REAL_LD_FILE_NAME
ld_file_name = REAL_LD_FILE_NAME;
#else
- ld_file_name = (access ("/usr/bin/ld", X_OK) == 0) ? "/usr/bin/ld" : "/bin/ld";
+ ld_file_name = (access ("/usr/bin/ld", X_OK) == 0
+ ? "/usr/bin/ld" : "/bin/ld");
#endif
}
}
+ /* Determine the full path name of the C compiler to use. */
c_file_name = getenv ("COLLECT_GCC");
if (c_file_name == 0 || c_file_name[0] != '/')
{
}
}
+ /* Determine the full path name of the nm to use. */
memcpy (nm_file_name, prefix, len);
strcpy (nm_file_name + len, "nm");
if (access (nm_file_name, X_OK) < 0)
#ifdef REAL_NM_FILE_NAME
nm_file_name = REAL_NM_FILE_NAME;
#else
- nm_file_name = (access ("/usr/bin/nm", X_OK) == 0) ? "/usr/bin/nm" : "/bin/nm";
+ nm_file_name = (access ("/usr/bin/nm", X_OK) == 0
+ ? "/usr/bin/nm" : "/bin/nm");
+#endif
+ }
+ }
+
+ /* Determine the full pathname of the strip to use. */
+ memcpy (strip_file_name, prefix, len);
+ strcpy (strip_file_name + len, "strip");
+ if (access (strip_file_name, X_OK) < 0)
+ {
+ strcpy (strip_file_name + len, "gstrip");
+ if (access (strip_file_name, X_OK) < 0)
+ {
+ free (strip_file_name);
+#ifdef REAL_STRIP_FILE_NAME
+ strip_file_name = REAL_STRIP_FILE_NAME;
+#else
+ strip_file_name = (access ("/usr/bin/strip", X_OK) == 0
+ ? "/usr/bin/strip" : "/bin/strip");
#endif
}
}
rflag = 1;
break;
+ case 's':
+ if (arg[2] == '\0')
+ {
+ /* We must strip after the nm run, otherwise C++ linking
+ won't work. Thus we strip in the second ld run, or
+ else with strip if there is no second ld run. */
+ strip_flag = 1;
+ ld1--;
+ }
+ break;
+
case 'v':
if (arg[2] == '\0')
vflag = 1;
}
if (constructors.number == 0 && destructors.number == 0)
- return 0;
+ {
+ /* Strip now if it was requested on the command line. */
+ if (strip_flag)
+ {
+ char **strip_argv = (char **) xcalloc (sizeof (char *), 3);
+ strip_argv[0] = "strip";
+ strip_argv[1] = outfile;
+ strip_argv[2] = (char *) 0;
+ fork_execute (strip_file_name, strip_argv);
+ }
+ return 0;
+ }
outf = fopen (c_file, "w");
if (outf == (FILE *)0)