diff options
author | Michael Meissner <meissner@gcc.gnu.org> | 1992-04-27 16:50:26 +0000 |
---|---|---|
committer | Michael Meissner <meissner@gcc.gnu.org> | 1992-04-27 16:50:26 +0000 |
commit | a87104d913a70d59e0641e9a68a88f3cd8671b9d (patch) | |
tree | 2a54fe412e812fad0c0da2879d7ef89f1ed16a79 | |
parent | bec2e3595757d4d7d43972b78fc4eee87e1be753 (diff) | |
download | gcc-a87104d913a70d59e0641e9a68a88f3cd8671b9d.zip gcc-a87104d913a70d59e0641e9a68a88f3cd8671b9d.tar.gz gcc-a87104d913a70d59e0641e9a68a88f3cd8671b9d.tar.bz2 |
*** empty log message ***
From-SVN: r840
-rw-r--r-- | gcc/collect2.c | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/gcc/collect2.c b/gcc/collect2.c index 3c6bc89..e1537d0 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -168,6 +168,7 @@ extern char *version_string; 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 */ @@ -176,6 +177,7 @@ static char *temp_filename; /* Base of temp filenames */ 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 */ @@ -465,7 +467,7 @@ main (argc, argv) 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) @@ -519,9 +521,12 @@ main (argc, argv) 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) @@ -533,11 +538,13 @@ main (argc, argv) #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] != '/') { @@ -564,6 +571,7 @@ main (argc, argv) } } + /* 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) @@ -575,7 +583,26 @@ main (argc, argv) #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 } } @@ -630,6 +657,17 @@ main (argc, argv) 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; @@ -720,7 +758,18 @@ main (argc, argv) } 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) |