* ltconfig, ltmain.sh, libtool.m4: Updated from libtool
[deliverable/binutils-gdb.git] / binutils / objcopy.c
index e8b710fa3bb82b4ce6f4e6f57f49026ae9cfb4d4..9147e2a6d4474755caecd85a65ad62147ef26412 100644 (file)
@@ -1,5 +1,5 @@
 /* objcopy.c -- copy object file from input to output, optionally massaging it.
-   Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 1999
+   Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000
    Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
@@ -25,6 +25,7 @@
 #include "getopt.h"
 #include "libiberty.h"
 #include "budbg.h"
+#include "filenames.h"
 #include <sys/stat.h>
 
 /* A list of symbols to explicitly strip out, or to keep.  A linked
@@ -556,6 +557,8 @@ filter_symbols (abfd, obfd, osyms, isyms, symcount)
 {
   register asymbol **from = isyms, **to = osyms;
   long src_count = 0, dst_count = 0;
+  int relocatable = (abfd->flags & (HAS_RELOC | EXEC_P | DYNAMIC))
+                   == HAS_RELOC;
 
   for (; src_count < symcount; src_count++)
     {
@@ -610,6 +613,9 @@ filter_symbols (abfd, obfd, osyms, isyms, symcount)
                   && ((*bfd_get_section (sym)->symbol_ptr_ptr)->flags
                       & BSF_KEEP) != 0))
        keep = 1;
+      else if (relocatable                     /* Relocatable file. */
+              && (flags & (BSF_GLOBAL | BSF_WEAK)) != 0)
+       keep = 1;
       else if ((flags & BSF_GLOBAL) != 0       /* Global symbol.  */
               || (flags & BSF_WEAK) != 0
               || bfd_is_und_section (bfd_get_section (sym))
@@ -1245,7 +1251,7 @@ setup_section (ibfd, isection, obfdarg)
   bfd_vma vma;
   bfd_vma lma;
   flagword flags;
-  char *err;
+  const char *err;
 
   if ((bfd_get_section_flags (ibfd, isection) & SEC_DEBUGGING) != 0
       && (strip_symbols == STRIP_DEBUG
@@ -1268,7 +1274,7 @@ setup_section (ibfd, isection, obfdarg)
 
   if (osection == NULL)
     {
-      err = "making";
+      err = _("making");
       goto loser;
     }
 
@@ -1277,7 +1283,7 @@ setup_section (ibfd, isection, obfdarg)
     size = (size + interleave - 1) / interleave;
   if (! bfd_set_section_size (obfd, osection, size))
     {
-      err = "size";
+      err = _("size");
       goto loser;
     }
 
@@ -1291,7 +1297,7 @@ setup_section (ibfd, isection, obfdarg)
 
   if (! bfd_set_section_vma (obfd, osection, vma))
     {
-      err = "vma";
+      err = _("vma");
       goto loser;
     }
 
@@ -1317,7 +1323,7 @@ setup_section (ibfd, isection, obfdarg)
                                 bfd_section_alignment (ibfd, isection))
       == false)
     {
-      err = "alignment";
+      err = _("alignment");
       goto loser;
     }
 
@@ -1326,7 +1332,7 @@ setup_section (ibfd, isection, obfdarg)
     flags = p->flags | (flags & SEC_HAS_CONTENTS);
   if (!bfd_set_section_flags (obfd, osection, flags))
     {
-      err = "flags";
+      err = _("flags");
       goto loser;
     }
 
@@ -1340,7 +1346,7 @@ setup_section (ibfd, isection, obfdarg)
      from the input section to the output section.  */
   if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
     {
-      err = "private data";
+      err = _("private data");
       goto loser;
     }
 
@@ -1662,7 +1668,7 @@ strip_main (argc, argv)
   struct section_list *p;
   char *output_file = NULL;
 
-  while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpgxXVv",
+  while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpdgxXVv",
                           strip_options, (int *) 0)) != EOF)
     {
       switch (c)
@@ -1686,6 +1692,7 @@ strip_main (argc, argv)
          break;
        case 'S':
        case 'g':
+       case 'd':       /* Historic BSD alias for -g.  Used by early NetBSD.  */
          strip_symbols = STRIP_DEBUG;
          break;
        case OPTION_STRIP_UNNEEDED:
@@ -2248,7 +2255,15 @@ main (argc, argv)
   if (is_strip < 0)
     {
       int i = strlen (program_name);
-      is_strip = (i >= 5 && strcmp (program_name + i - 5, "strip") == 0);
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+      /* Drop the .exe suffix, if any.  */
+      if (i > 4 && FILENAME_CMP (program_name + i - 4, ".exe") == 0)
+       {
+         i -= 4;
+         program_name[i] = '\0';
+       }
+#endif
+      is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
     }
 
   if (is_strip)
This page took 0.024485 seconds and 4 git commands to generate.