Fixed xgettext invocation in .Sanitize files
[binutils-gdb.git] / bfd / section.c
index e9fbcf9083b8cef6233fb1195092f5bb7f88dec2..564a51e5bdbbb732e6c8dbe262f8077ec9488fbf 100644 (file)
@@ -1,5 +1,5 @@
 /* Object file "section" support for the BFD library.
-   Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+   Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -16,7 +16,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /*
 SECTION
@@ -226,19 +226,25 @@ CODE_FRAGMENT
 .#define SEC_HAS_CONTENTS 0x200
 .
 .        {* An instruction to the linker to not output the section
-.          even if it has information which would normally be written. *}
+.           even if it has information which would normally be written. *}
 .#define SEC_NEVER_LOAD 0x400
 .
-.        {* The section is a shared library section.  The linker must leave
-.           these completely alone, as the vma and size are used when
-.           the executable is loaded. *}
-.#define SEC_SHARED_LIBRARY 0x800
-.
-.        {* The section is a common section (symbols may be defined
+.        {* The section is a COFF shared library section.  This flag is
+.           only for the linker.  If this type of section appears in
+.           the input file, the linker must copy it to the output file
+.           without changing the vma or size.  FIXME: Although this
+.           was originally intended to be general, it really is COFF
+.           specific (and the flag was renamed to indicate this).  It
+.           might be cleaner to have some more general mechanism to
+.           allow the back end to control what the linker does with
+.           sections. *}
+.#define SEC_COFF_SHARED_LIBRARY 0x800
+.
+.        {* The section contains common symbols (symbols may be defined
 .           multiple times, the value of a symbol is the amount of
 .           space it requires, and the largest symbol value is the one
 .           used).  Most targets have exactly one of these (which we
-.          translate to bfd_com_section), but ECOFF has two. *}
+.          translate to bfd_com_section_ptr), but ECOFF has two. *}
 .#define SEC_IS_COMMON 0x8000
 .
 .        {* The section contains only debugging information.  For
@@ -253,8 +259,65 @@ CODE_FRAGMENT
 .           memory if appropriate.  *}
 .#define SEC_IN_MEMORY 0x20000
 .
+.        {* The contents of this section are to be excluded by the
+.          linker for executable and shared objects unless those
+.          objects are to be further relocated.  *}
+.#define SEC_EXCLUDE 0x40000
+.
+.      {* The contents of this section are to be sorted by the
+.         based on the address specified in the associated symbol
+.         table.  *}
+.#define SEC_SORT_ENTRIES 0x80000
+.
+.      {* When linking, duplicate sections of the same name should be
+.         discarded, rather than being combined into a single section as
+.         is usually done.  This is similar to how common symbols are
+.         handled.  See SEC_LINK_DUPLICATES below.  *}
+.#define SEC_LINK_ONCE 0x100000
+.
+.      {* If SEC_LINK_ONCE is set, this bitfield describes how the linker
+.         should handle duplicate sections.  *}
+.#define SEC_LINK_DUPLICATES 0x600000
+.
+.      {* This value for SEC_LINK_DUPLICATES means that duplicate
+.         sections with the same name should simply be discarded. *}
+.#define SEC_LINK_DUPLICATES_DISCARD 0x0
+.
+.      {* This value for SEC_LINK_DUPLICATES means that the linker
+.         should warn if there are any duplicate sections, although
+.         it should still only link one copy.  *}
+.#define SEC_LINK_DUPLICATES_ONE_ONLY 0x200000
+.
+.      {* This value for SEC_LINK_DUPLICATES means that the linker
+.         should warn if any duplicate sections are a different size.  *}
+.#define SEC_LINK_DUPLICATES_SAME_SIZE 0x400000
+.
+.      {* This value for SEC_LINK_DUPLICATES means that the linker
+.         should warn if any duplicate sections contain different
+.         contents.  *}
+.#define SEC_LINK_DUPLICATES_SAME_CONTENTS 0x600000
+.
+.      {* This section was created by the linker as part of dynamic
+.         relocation or other arcane processing.  It is skipped when
+.         going through the first-pass output, trusting that someone
+.         else up the line will take care of it later.  *}
+.#define SEC_LINKER_CREATED 0x800000
+.
 .      {*  End of section flags.  *}
 .
+.      {* Some internal packed boolean fields.  *}
+.
+.      {* See the vma field.  *}
+.      unsigned int user_set_vma : 1;
+.
+.      {* Whether relocations have been processed.  *}
+.      unsigned int reloc_done : 1;
+.
+.      {* A mark flag used by some of the linker backends.  *}
+.      unsigned int linker_mark : 1;
+.
+.      {* End of internal packed boolean fields.  *}
+.
 .       {*  The virtual memory address of the section - where it will be
 .           at run time.  The symbols are relocated against this.  The
 .          user_set_vma flag is maintained by bfd; if it's not set, the
@@ -263,7 +326,6 @@ CODE_FRAGMENT
 .          target and various flags).  *}
 .
 .   bfd_vma vma;
-.   boolean user_set_vma;
 .
 .       {*  The load address of the section - where it would be in a
 .           rom image; really only used for writing section header
@@ -364,7 +426,6 @@ CODE_FRAGMENT
 .
 .   bfd *owner;
 .
-.   boolean reloc_done;
 .       {* A symbol which points at this section only *}
 .   struct symbol_cache_entry *symbol;
 .   struct symbol_cache_entry **symbol_ptr_ptr;
@@ -373,28 +434,36 @@ CODE_FRAGMENT
 .   struct bfd_link_order *link_order_tail;
 .} asection ;
 .
-.
 .    {* These sections are global, and are managed by BFD.  The application
 .       and target back end are not permitted to change the values in
-.      these sections.  *}
+.      these sections.  New code should use the section_ptr macros rather
+.       than referring directly to the const sections.  The const sections
+.       may eventually vanish.  *}
 .#define BFD_ABS_SECTION_NAME "*ABS*"
 .#define BFD_UND_SECTION_NAME "*UND*"
 .#define BFD_COM_SECTION_NAME "*COM*"
 .#define BFD_IND_SECTION_NAME "*IND*"
 .
 .    {* the absolute section *}
-.extern asection bfd_abs_section;
+.extern const asection bfd_abs_section;
+.#define bfd_abs_section_ptr ((asection *) &bfd_abs_section)
+.#define bfd_is_abs_section(sec) ((sec) == bfd_abs_section_ptr)
 .    {* Pointer to the undefined section *}
-.extern asection bfd_und_section;
+.extern const asection bfd_und_section;
+.#define bfd_und_section_ptr ((asection *) &bfd_und_section)
+.#define bfd_is_und_section(sec) ((sec) == bfd_und_section_ptr)
 .    {* Pointer to the common section *}
-.extern asection bfd_com_section;
+.extern const asection bfd_com_section;
+.#define bfd_com_section_ptr ((asection *) &bfd_com_section)
 .    {* Pointer to the indirect section *}
-.extern asection bfd_ind_section;
-.
-.extern struct symbol_cache_entry *bfd_abs_symbol;
-.extern struct symbol_cache_entry *bfd_com_symbol;
-.extern struct symbol_cache_entry *bfd_und_symbol;
-.extern struct symbol_cache_entry *bfd_ind_symbol;
+.extern const asection bfd_ind_section;
+.#define bfd_ind_section_ptr ((asection *) &bfd_ind_section)
+.#define bfd_is_ind_section(sec) ((sec) == bfd_ind_section_ptr)
+.
+.extern const struct symbol_cache_entry * const bfd_abs_symbol;
+.extern const struct symbol_cache_entry * const bfd_com_symbol;
+.extern const struct symbol_cache_entry * const bfd_und_symbol;
+.extern const struct symbol_cache_entry * const bfd_ind_symbol;
 .#define bfd_get_section_size_before_reloc(section) \
 .     (section->reloc_done ? (abort(),1): (section)->_raw_size)
 .#define bfd_get_section_size_after_reloc(section) \
@@ -403,22 +472,24 @@ CODE_FRAGMENT
 
 /* These symbols are global, not specific to any BFD.  Therefore, anything
    that tries to change them is broken, and should be repaired.  */
-static CONST asymbol global_syms[] =
+static const asymbol global_syms[] =
 {
  /* the_bfd, name, value, attr, section [, udata] */
-  {0, BFD_COM_SECTION_NAME, 0, BSF_SECTION_SYM, &bfd_com_section},
-  {0, BFD_UND_SECTION_NAME, 0, BSF_SECTION_SYM, &bfd_und_section},
-  {0, BFD_ABS_SECTION_NAME, 0, BSF_SECTION_SYM, &bfd_abs_section},
-  {0, BFD_IND_SECTION_NAME, 0, BSF_SECTION_SYM, &bfd_ind_section},
+  {0, BFD_COM_SECTION_NAME, 0, BSF_SECTION_SYM, (asection *) &bfd_com_section},
+  {0, BFD_UND_SECTION_NAME, 0, BSF_SECTION_SYM, (asection *) &bfd_und_section},
+  {0, BFD_ABS_SECTION_NAME, 0, BSF_SECTION_SYM, (asection *) &bfd_abs_section},
+  {0, BFD_IND_SECTION_NAME, 0, BSF_SECTION_SYM, (asection *) &bfd_ind_section},
 };
 
 #define STD_SECTION(SEC, FLAGS, SYM, NAME, IDX)        \
-  asymbol *SYM = (asymbol *) &global_syms[IDX]; \
-  asection SEC = { NAME, 0, 0, FLAGS, 0, 0, (boolean) 0, 0, 0, 0, &SEC,\
-                   0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, (boolean) 0, \
-                    (asymbol *) &global_syms[IDX], &SYM, }
-
-STD_SECTION (bfd_com_section, SEC_IS_COMMON, bfd_com_symbol, BFD_COM_SECTION_NAME, 0);
+  const asymbol * const SYM = (asymbol *) &global_syms[IDX]; \
+  const asection SEC = \
+    { NAME, 0, 0, FLAGS, 0, 0, 0, 0, 0, 0, 0, 0, (asection *) &SEC, \
+      0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, \
+      (asymbol *) &global_syms[IDX], (asymbol **) &SYM, 0, 0 }
+
+STD_SECTION (bfd_com_section, SEC_IS_COMMON, bfd_com_symbol,
+            BFD_COM_SECTION_NAME, 0);
 STD_SECTION (bfd_und_section, 0, bfd_und_symbol, BFD_UND_SECTION_NAME, 1);
 STD_SECTION (bfd_abs_section, 0, bfd_abs_symbol, BFD_ABS_SECTION_NAME, 2);
 STD_SECTION (bfd_ind_section, 0, bfd_ind_symbol, BFD_IND_SECTION_NAME, 3);
@@ -545,10 +616,7 @@ bfd_make_section_anyway (abfd, name)
 
   newsect = (asection *) bfd_zalloc (abfd, sizeof (asection));
   if (newsect == NULL)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      return NULL;
-    }
+    return NULL;
 
   newsect->name = name;
   newsect->index = abfd->section_count++;
@@ -566,7 +634,7 @@ bfd_make_section_anyway (abfd, name)
      useful for things like relocs which are relative to the base of a
      section.  */
   newsect->symbol = bfd_make_empty_symbol (abfd);
-  if (!newsect)
+  if (newsect->symbol == NULL)
     return NULL;
   newsect->symbol->name = name;
   newsect->symbol->value = 0;
@@ -599,7 +667,7 @@ DESCRIPTION
    <<bfd_error>>.
 */
 
-sec_ptr
+asection *
 bfd_make_section (abfd, name)
      bfd *abfd;
      CONST char *name;
@@ -608,20 +676,20 @@ bfd_make_section (abfd, name)
 
   if (strcmp (name, BFD_ABS_SECTION_NAME) == 0)
     {
-      return &bfd_abs_section;
+      return bfd_abs_section_ptr;
     }
   if (strcmp (name, BFD_COM_SECTION_NAME) == 0)
     {
-      return &bfd_com_section;
+      return bfd_com_section_ptr;
     }
   if (strcmp (name, BFD_UND_SECTION_NAME) == 0)
     {
-      return &bfd_und_section;
+      return bfd_und_section_ptr;
     }
 
   if (strcmp (name, BFD_IND_SECTION_NAME) == 0)
     {
-      return &bfd_ind_section;
+      return bfd_ind_section_ptr;
     }
 
   while (sect)
@@ -716,7 +784,7 @@ bfd_map_over_sections (abfd, operation, user_storage)
      PTR user_storage;
 {
   asection *sect;
-  int i = 0;
+  unsigned int i = 0;
 
   for (sect = abfd->sections; sect != NULL; i++, sect = sect->next)
     (*operation) (abfd, sect, user_storage);
@@ -813,7 +881,7 @@ bfd_set_section_contents (abfd, section, location, offset, count)
 {
   bfd_size_type sz;
 
-  if (!bfd_get_section_flags (abfd, section) & SEC_HAS_CONTENTS)
+  if (!(bfd_get_section_flags (abfd, section) & SEC_HAS_CONTENTS))
     {
       bfd_set_error (bfd_error_no_contents);
       return (false);
@@ -826,7 +894,7 @@ bfd_set_section_contents (abfd, section, location, offset, count)
       return false;
     }
   sz = bfd_get_section_size_now (abfd, section);
-  if (offset > sz
+  if ((bfd_size_type) offset > sz
       || count > sz
       || offset + count > sz)
     goto bad_val;
@@ -908,7 +976,7 @@ bfd_get_section_contents (abfd, section, location, offset, count)
   /* Even if reloc_done is true, this function reads unrelocated
      contents, so we want the raw size.  */
   sz = section->_raw_size;
-  if (offset > sz || count > sz || offset + count > sz)
+  if ((bfd_size_type) offset > sz || count > sz || offset + count > sz)
     goto bad_val;
 
   if (count == 0)
@@ -923,10 +991,31 @@ bfd_get_section_contents (abfd, section, location, offset, count)
 
   if ((section->flags & SEC_IN_MEMORY) != 0)
     {
-      memcpy (location, section->contents + offset, count);
+      memcpy (location, section->contents + offset, (size_t) count);
       return true;
     }
 
   return BFD_SEND (abfd, _bfd_get_section_contents,
                   (abfd, section, location, offset, count));
 }
+
+/*
+FUNCTION
+       bfd_copy_private_section_data
+
+SYNOPSIS
+       boolean bfd_copy_private_section_data(bfd *ibfd, asection *isec, bfd *obfd, asection *osec);
+
+DESCRIPTION
+       Copy private section information from @var{isec} in the BFD
+       @var{ibfd} to the section @var{osec} in the BFD @var{obfd}.
+       Return <<true>> on success, <<false>> on error.  Possible error
+       returns are:
+
+       o <<bfd_error_no_memory>> -
+       Not enough memory exists to create private data for @var{osec}.
+
+.#define bfd_copy_private_section_data(ibfd, isection, obfd, osection) \
+.     BFD_SEND (obfd, _bfd_copy_private_section_data, \
+.              (ibfd, isection, obfd, osection))
+*/