]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
collect2.c (aix64_flag): New variable.
authorDavid Edelsohn <edelsohn@mhpcc.edu>
Wed, 28 Oct 1998 19:18:09 +0000 (19:18 +0000)
committerJeff Law <law@gcc.gnu.org>
Wed, 28 Oct 1998 19:18:09 +0000 (12:18 -0700)
        * collect2.c (aix64_flag): New variable.
        (main, case 'b'): Parse it.
        (GCC_CHECK_HDR): object magic number must match mode.
        (scan_prog_file): Only check for shared object if valid header.
        Print debugging if header/mode mismatch.
        * README.RS6000: Update.

From-SVN: r23408

gcc/ChangeLog
gcc/README.RS6000
gcc/collect2.c

index 155a2b84f946fe51bb496f1edbc440718786bfd0..af620b2bc348b9a1959b75c47c9ad2d08213bf6a 100644 (file)
@@ -1,3 +1,12 @@
+Tue Oct 27 16:11:43 1998  David Edelsohn  <edelsohn@mhpcc.edu>
+
+       * collect2.c (aix64_flag): New variable.
+       (main, case 'b'): Parse it.
+       (GCC_CHECK_HDR): object magic number must match mode.
+       (scan_prog_file): Only check for shared object if valid header.
+       Print debugging if header/mode mismatch.
+       * README.RS6000: Update.
+
 Sun Oct 25 23:36:52 1998  Jason Merrill  <jason@yorick.cygnus.com>
 
        * stmt.c (expand_fixup): Set fixup->before_jump to a
index fde55b0178206bb1e58b6f83b1949e867266cba7..5e8225e4f09ea4f8d5168f4f7014d092de91d084 100644 (file)
@@ -1,3 +1,16 @@
+                       AIX 4.3 archive libraries
+
+AIX 4.3 utilizes a new "large format" archive to support both 32-bit and
+64-bit object modules.  The routines provided in AIX 4.3.0 and AIX 4.3.1
+to parse archive libraries did not handle the new format correctly.  These
+routines are used by GCC and result in error messages during linking such
+as "not a COFF file".  The version of the routines shipped with AIX 4.3.1
+should work for a 32-bit environment.  The "-g" option of the archive
+command may be used to create archives of 32-bit objects using the
+original "small format".  A correct version of the routines is shipped
+with AIX 4.3.2.
+
+
                            AIX 4.3 assembler
 
 The AIX 4.3.0.0 assembler generates incorrect object files if the ".bs"
index 539e088472fb659cde6cc73fce9d9dd0e7b22616..4fcbe73a4372fc839fe402edc430e1e8aea3a5a1 100644 (file)
@@ -198,6 +198,7 @@ static int rflag;                   /* true if -r */
 static int strip_flag;                 /* true if -s */
 #ifdef COLLECT_EXPORT_LIST
 static int export_flag;                 /* true if -bE */
+static int aix64_flag;                 /* true if -b64 */
 #endif
 
 int debug;                             /* true if -debug */
@@ -1194,6 +1195,8 @@ main (argc, argv)
            case 'b':
              if (arg[2] == 'E' || strncmp (&arg[2], "export", 6) == 0)
                 export_flag = 1;
+             if (arg[2] == '6' && arg[3] == '4')
+               aix64_flag = 1;
              break;
 #endif
 
@@ -2669,7 +2672,9 @@ scan_libraries (prog_name)
      (((X).n_sclass == C_EXT) && ((X).n_scnum == N_UNDEF))
 #   define GCC_SYMINC(X)       ((X).n_numaux+1)
 #   define GCC_SYMZERO(X)      0
-#   define GCC_CHECK_HDR(X)    (1)
+#   define GCC_CHECK_HDR(X) \
+     ((HEADER (X).f_magic == U802TOCMAGIC && ! aix64_flag) \
+      || (HEADER (X).f_magic == 0757 && aix64_flag))
 #endif
 
 extern char *ldgetname ();
@@ -2712,18 +2717,19 @@ scan_prog_file (prog_name, which_pass)
 #endif
       if ((ldptr = ldopen (prog_name, ldptr)) != NULL)
        {
-
-         if (!MY_ISCOFF (HEADER (ldptr).f_magic))
+         if (! MY_ISCOFF (HEADER (ldptr).f_magic))
            fatal ("%s: not a COFF file", prog_name);
 
-#ifdef COLLECT_EXPORT_LIST
-         /* Is current archive member a shared object?  */
-         is_shared = HEADER (ldptr).f_flags & F_SHROBJ;
-#endif
          if (GCC_CHECK_HDR (ldptr))
            {
              sym_count = GCC_SYMBOLS (ldptr);
              sym_index = GCC_SYMZERO (ldptr);
+
+#ifdef COLLECT_EXPORT_LIST
+             /* Is current archive member a shared object?  */
+             is_shared = HEADER (ldptr).f_flags & F_SHROBJ;
+#endif
+
              while (sym_index < sym_count)
                {
                  GCC_SYMENT symbol;
@@ -2841,6 +2847,16 @@ scan_prog_file (prog_name, which_pass)
 #endif
                }
            }
+#ifdef COLLECT_EXPORT_LIST
+         else
+           {
+             /* If archive contains both 32-bit and 64-bit objects,
+                we want to skip objects in other mode so mismatch normal.  */
+             if (debug)
+               fprintf (stderr, "%s : magic=%o aix64=%d mismatch\n",
+                        prog_name, HEADER (ldptr).f_magic, aix64_flag);
+           }
+#endif
        }
       else
        {