* section.c (_bfd_strip_section_from_output): Add info parameter.
authorIan Lance Taylor <ian@airs.com>
Sun, 13 Feb 2000 22:45:29 +0000 (22:45 +0000)
committerIan Lance Taylor <ian@airs.com>
Sun, 13 Feb 2000 22:45:29 +0000 (22:45 +0000)
If it passed as non-NULL, use it to check whether any input BFD
has an input section which uses this output section.  Change all
callers.
* bfd-in2.h: Rebuild.

* bfd-in.h: Move declarations of bfd_get_elf_phdr_upper_bound and
bfd_get_elf_phdrs in from bfd-in2.h, correcting patch of
1999-11-29.
* bfd-in2.h: Rebuild.

12 files changed:
bfd/ChangeLog
bfd/bfd-in.h
bfd/bfd-in2.h
bfd/elf32-i386.c
bfd/elf32-m68k.c
bfd/elf32-mips.c
bfd/elf32-ppc.c
bfd/elf32-sparc.c
bfd/elf64-alpha.c
bfd/elf64-sparc.c
bfd/elflink.h
bfd/section.c

index 1fd998bd4819c006f9970439d26d79c7119581e1..1b629ea518d677029fc6a734743ac9893494f522 100644 (file)
@@ -1,3 +1,16 @@
+2000-02-13  Ian Lance Taylor  <ian@zembu.com>
+
+       * section.c (_bfd_strip_section_from_output): Add info parameter.
+       If it passed as non-NULL, use it to check whether any input BFD
+       has an input section which uses this output section.  Change all
+       callers.
+       * bfd-in2.h: Rebuild.
+
+       * bfd-in.h: Move declarations of bfd_get_elf_phdr_upper_bound and
+       bfd_get_elf_phdrs in from bfd-in2.h, correcting patch of
+       1999-11-29.
+       * bfd-in2.h: Rebuild.
+
 2000-02-10  Timothy Wall  <twall@cygnus.com>
 
        * coffswap.h (coff_swap_sym_in): Add hook SWAP_SYM_IN_POST to
index b5ff7dd5891dab633ca52589b0372d2bdf5c0d14..a5312f433977bf3570433b3dd9986f634ece2d4a 100644 (file)
@@ -626,6 +626,20 @@ extern boolean bfd_elf64_size_dynamic_sections
 extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *));
 extern const char *bfd_elf_get_dt_soname PARAMS ((bfd *));
 
+/* Return an upper bound on the number of bytes required to store a
+   copy of ABFD's program header table entries.  Return -1 if an error
+   occurs; bfd_get_error will return an appropriate code.  */
+extern long bfd_get_elf_phdr_upper_bound PARAMS ((bfd *abfd));
+
+/* Copy ABFD's program header table entries to *PHDRS.  The entries
+   will be stored as an array of Elf_Internal_Phdr structures, as
+   defined in include/elf/internal.h.  To find out how large the
+   buffer needs to be, call bfd_get_elf_phdr_upper_bound.
+
+   Return the number of program header table entries read, or -1 if an
+   error occurs; bfd_get_error will return an appropriate code.  */
+extern int bfd_get_elf_phdrs PARAMS ((bfd *abfd, void *phdrs));
+
 /* SunOS shared library support routines for the linker.  */
 
 extern struct bfd_link_needed_list *bfd_sunos_get_needed_list
index 9db6ec6a40ff6cbf7f08e1ed9df174d79a9f1916..7ec5d70c911d7052a24fb53888320cab8eb4bd15 100644 (file)
@@ -626,6 +626,20 @@ extern boolean bfd_elf64_size_dynamic_sections
 extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *));
 extern const char *bfd_elf_get_dt_soname PARAMS ((bfd *));
 
+/* Return an upper bound on the number of bytes required to store a
+   copy of ABFD's program header table entries.  Return -1 if an error
+   occurs; bfd_get_error will return an appropriate code.  */
+extern long bfd_get_elf_phdr_upper_bound PARAMS ((bfd *abfd));
+
+/* Copy ABFD's program header table entries to *PHDRS.  The entries
+   will be stored as an array of Elf_Internal_Phdr structures, as
+   defined in include/elf/internal.h.  To find out how large the
+   buffer needs to be, call bfd_get_elf_phdr_upper_bound.
+
+   Return the number of program header table entries read, or -1 if an
+   error occurs; bfd_get_error will return an appropriate code.  */
+extern int bfd_get_elf_phdrs PARAMS ((bfd *abfd, void *phdrs));
+
 /* SunOS shared library support routines for the linker.  */
 
 extern struct bfd_link_needed_list *bfd_sunos_get_needed_list
@@ -1084,7 +1098,7 @@ typedef struct sec
            target).  In most cases, if this was going to start at the
            100th octet (8-bit quantity) in the output section, this value
            would be 100.  However, if the target byte size is 16 bits
-           (bfd_octets_per_byte is "2"), this value would be 50. */ 
+           (bfd_octets_per_byte is "2"), this value would be 50. */
 
    bfd_vma output_offset;
 
@@ -1254,7 +1268,7 @@ bfd_copy_private_section_data PARAMS ((bfd *ibfd, asection *isec, bfd *obfd, ase
                (ibfd, isection, obfd, osection))
 void 
 _bfd_strip_section_from_output
- PARAMS ((asection *section));
+ PARAMS ((struct bfd_link_info *info, asection *section));
 
 enum bfd_architecture 
 {
@@ -1379,7 +1393,7 @@ enum bfd_architecture
   bfd_arch_mn10200,    /* Matsushita MN10200 */
   bfd_arch_mn10300,    /* Matsushita MN10300 */
 #define bfd_mach_mn10300               300
-#define bfd_mach_am33               330
+#define bfd_mach_am33          330
   bfd_arch_fr30,
 #define bfd_mach_fr30          0x46523330
   bfd_arch_mcore,
@@ -1454,7 +1468,7 @@ bfd_octets_per_byte PARAMS ((bfd *abfd));
 
 int 
 bfd_arch_mach_octets_per_byte PARAMS ((enum bfd_architecture arch,
-                                       unsigned long machine));
+    unsigned long machine));
 
 typedef enum bfd_reloc_status
 {
@@ -2433,8 +2447,8 @@ bfd_print_symbol_vandf PARAMS ((PTR file, asymbol *symbol));
 int 
 bfd_decode_symclass PARAMS ((asymbol *symbol));
 
-boolean
-bfd_is_undefined_symclass PARAMS ((int symclass));
+boolean 
+bfd_is_undefined_symclass  PARAMS ((int symclass));
 
 void 
 bfd_symbol_info PARAMS ((asymbol *symbol, symbol_info *ret));
@@ -3105,22 +3119,6 @@ bfd_set_format PARAMS ((bfd *abfd, bfd_format format));
 CONST char *
 bfd_format_string PARAMS ((bfd_format format));
 
-
-/* Return an upper bound on the number of bytes required to store a
-   copy of ABFD's program header table entries.  Return -1 if an error
-   occurs; bfd_get_error will return an appropriate code.  */
-extern long bfd_get_elf_phdr_upper_bound PARAMS ((bfd *abfd));
-
-/* Copy ABFD's program header table entries to *PHDRS.  The entries
-   will be stored as an array of Elf_Internal_Phdr structures, as
-   defined in include/elf/internal.h.  To find out how large the
-   buffer needs to be, call bfd_get_elf_phdr_upper_bound.
-
-   Return the number of program header table entries read, or -1 if an
-   error occurs; bfd_get_error will return an appropriate code.  */
-extern int bfd_get_elf_phdrs PARAMS ((bfd *abfd, void *phdrs));
-
-
 #ifdef __cplusplus
 }
 #endif
index 33514ac9bff7f1a921cf76e4e92644d737a3d0f0..08944761d9e216c49a380d2e08add3a758cbd0ea 100644 (file)
@@ -1085,7 +1085,7 @@ elf_i386_size_dynamic_sections (output_bfd, info)
 
       if (strip)
        {
-         _bfd_strip_section_from_output (s);
+         _bfd_strip_section_from_output (info, s);
          continue;
        }
 
index c87ec7a1f1ff854c391bca62e1f524c2e8355e7f..06ba12c9983bcc492c7c2883f9b8d01b28181609 100644 (file)
@@ -1262,7 +1262,7 @@ elf_m68k_size_dynamic_sections (output_bfd, info)
 
       if (strip)
        {
-         _bfd_strip_section_from_output (s);
+         _bfd_strip_section_from_output (info, s);
          continue;
        }
 
index 6db9c239e73e55a36346ae8ec73903110a80ff68..d9832b67b94066ec617398fc06e8a23c59394071 100644 (file)
@@ -7920,7 +7920,7 @@ _bfd_mips_elf_size_dynamic_sections (output_bfd, info)
 
       if (strip)
        {
-         _bfd_strip_section_from_output (s);
+         _bfd_strip_section_from_output (info, s);
          continue;
        }
 
index 1de197b224c9727b5f4ad813665e26dcd3b17d0d..7c5f589cd12076f0c18a6c3c6ac99e3f0dcc4479 100644 (file)
@@ -2012,7 +2012,7 @@ ppc_elf_size_dynamic_sections (output_bfd, info)
 
       if (strip)
        {
-         _bfd_strip_section_from_output (s);
+         _bfd_strip_section_from_output (info, s);
          continue;
        }
 
index 979d25b595a1071d384a17ecd6f3d8e2d670c008..bf347827d093ddab4578907ac034a1d141fea6e7 100644 (file)
@@ -1010,7 +1010,7 @@ elf32_sparc_size_dynamic_sections (output_bfd, info)
 
       if (strip)
        {
-         _bfd_strip_section_from_output (s);
+         _bfd_strip_section_from_output (info, s);
          continue;
        }
 
index 3a14bcc3a67c5f02318fbca28ab7cf737c6a5ce5..a21d1b9f32c03568cd213a756c63030b7b4f4f0f 100644 (file)
@@ -3263,7 +3263,7 @@ elf64_alpha_size_dynamic_sections (output_bfd, info)
        }
 
       if (strip)
-       _bfd_strip_section_from_output (s);
+       _bfd_strip_section_from_output (info, s);
       else
        {
          /* Allocate memory for the section contents.  */
index b02789724f058c58462845bea76ebdb84a5ceb25..5ea95e94deab3bd711950d90cc4610aba9c1a17f 100644 (file)
@@ -1752,7 +1752,7 @@ sparc64_elf_size_dynamic_sections (output_bfd, info)
 
       if (strip)
        {
-         _bfd_strip_section_from_output (s);
+         _bfd_strip_section_from_output (info, s);
          continue;
        }
 
index f15c693422c3fe84f7339a4cdcdeb4bdaa3aac70..ce71d948c43f894a8357428221f3422d004899f4 100644 (file)
@@ -2981,7 +2981,7 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath,
       verdefs = asvinfo.verdefs;
 
       if (verdefs == NULL)
-       _bfd_strip_section_from_output (s);
+       _bfd_strip_section_from_output (info, s);
       else
        {
          unsigned int cdefs;
@@ -3157,7 +3157,7 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath,
                                (PTR) &sinfo);
 
        if (elf_tdata (output_bfd)->verref == NULL)
-         _bfd_strip_section_from_output (s);
+         _bfd_strip_section_from_output (info, s);
        else
          {
            Elf_Internal_Verneed *t;
@@ -3261,7 +3261,7 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath,
       if (dynsymcount == 0
          || (verdefs == NULL && elf_tdata (output_bfd)->verref == NULL))
        {
-         _bfd_strip_section_from_output (s);
+         _bfd_strip_section_from_output (info, s);
          /* The DYNSYMCOUNT might have changed if we were going to
             output a dynamic symbol table entry for S.  */
          dynsymcount = _bfd_elf_link_renumber_dynsyms (output_bfd, info);
index c0bf60d29c52f4affa32186264cd29fecdda5796..6e50d168ba213e1fd7fd56ddbb6e129087e8ae44 100644 (file)
@@ -1100,20 +1100,28 @@ FUNCTION
 
 SYNOPSIS
        void _bfd_strip_section_from_output
-       (asection *section);
+       (struct bfd_link_info *info, asection *section);
 
 DESCRIPTION
-       Remove @var{section} from the output.  If the output section becomes
-       empty, remove it from the output bfd.
+       Remove @var{section} from the output.  If the output section
+       becomes empty, remove it from the output bfd.  @var{info} may
+       be NULL; if it is not, it is used to decide whether the output
+       section is empty.
 */
 void
-_bfd_strip_section_from_output (s)
+_bfd_strip_section_from_output (info, s)
+     struct bfd_link_info *info;
      asection *s;
 {
   asection **spp, *os;
   struct bfd_link_order *p, *pp;
+  boolean keep_os;
 
-  /* Excise the input section from the link order.  */
+  /* Excise the input section from the link order.
+
+     FIXME: For all calls that I can see to this function, the link
+     orders have not yet been set up.  So why are we checking them? --
+     Ian */
   os = s->output_section;
   for (p = os->link_order_head, pp = NULL; p != NULL; pp = p, p = p->next)
     if (p->type == bfd_indirect_link_order
@@ -1128,10 +1136,30 @@ _bfd_strip_section_from_output (s)
        break;
       }
 
+  keep_os = os->link_order_head != NULL;
+
+  if (! keep_os && info != NULL)
+    {
+      bfd *abfd;
+      for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
+       {
+         asection *is;
+         for (is = abfd->sections; is != NULL; is = is->next)
+           {
+             if (is != s && is->output_section == os)
+               break;
+           }
+         if (is != NULL)
+           break;
+       }
+      if (abfd != NULL)
+       keep_os = true;
+    }
+
   /* If the output section is empty, remove it too.  Careful about sections
      that have been discarded in the link script -- they are mapped to 
      bfd_abs_section, which has no owner.  */
-  if (!os->link_order_head && os->owner)
+  if (!keep_os && os->owner != NULL)
     {
       for (spp = &os->owner->sections; *spp; spp = &(*spp)->next)
        if (*spp == os)