aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <merrill@gnu.org>1995-02-13 20:21:44 +0000
committerJason Merrill <merrill@gnu.org>1995-02-13 20:21:44 +0000
commit9f21696b100aee891659bb39d4850295f7877912 (patch)
treec3773f34c1bfdd99f54d975ffef28d44d0a9d281
parentd1e1adfb128e33b98deb622af8e33844c1d98d2b (diff)
downloadgcc-9f21696b100aee891659bb39d4850295f7877912.zip
gcc-9f21696b100aee891659bb39d4850295f7877912.tar.gz
gcc-9f21696b100aee891659bb39d4850295f7877912.tar.bz2
Fix collecting under AIX
From-SVN: r8933
-rw-r--r--gcc/collect2.c27
-rw-r--r--gcc/config/rs6000/rs6000.h4
2 files changed, 24 insertions, 7 deletions
diff --git a/gcc/collect2.c b/gcc/collect2.c
index be28cc6..c47a167 100644
--- a/gcc/collect2.c
+++ b/gcc/collect2.c
@@ -824,6 +824,8 @@ main (argc, argv)
char **ld1 = ld1_argv;
char **ld2_argv = (char **) xcalloc (sizeof (char *), argc+5);
char **ld2 = ld2_argv;
+ char **object_lst = (char **) xcalloc (sizeof (char *), argc);
+ char **object = object_lst;
int first_file;
int num_c_args = argc+7;
@@ -1154,15 +1156,19 @@ main (argc, argv)
break;
}
}
- else if (first_file
- && (p = rindex (arg, '.')) != (char *)0
+ else if ((p = rindex (arg, '.')) != (char *)0
&& (strcmp (p, ".o") == 0 || strcmp (p, ".a") == 0))
{
- first_file = 0;
- /* place o_file BEFORE this argument! */
- ld2--;
- *ld2++ = o_file;
- *ld2++ = arg;
+ if (first_file)
+ {
+ first_file = 0;
+ /* place o_file BEFORE this argument! */
+ ld2--;
+ *ld2++ = o_file;
+ *ld2++ = arg;
+ }
+ if (p[1] == 'o')
+ *object++ = arg;
}
}
@@ -1261,6 +1267,13 @@ main (argc, argv)
if (rflag)
return 0;
+#ifdef COLLECT_SCAN_OBJECTS
+ /* The AIX linker will discard static constructors in object files if
+ nothing else in the file is referenced, so look at them first. */
+ while (object_lst < object)
+ scan_prog_file (*object_lst++, PASS_FIRST);
+#endif
+
scan_prog_file (output_file, PASS_FIRST);
#ifdef SCAN_LIBRARIES
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index 8daf168..099dda0 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -98,6 +98,10 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Don't turn -B into -L if the argument specifies a relative file name. */
#define RELATIVE_PREFIX_NOT_LINKDIR
+/* The AIX linker will discard static constructors in object files before
+ collect has a chance to see them, so scan the object files directly. */
+#define COLLECT_SCAN_OBJECTS
+
/* Architecture type. */
extern int target_flags;