(SEC_HAS_GOT_REF): Define new flag for asection.
[deliverable/binutils-gdb.git] / bfd / section.c
index 3b5162983e2fc1e0d0fb5d75bcccafcf23b911a3..69d80cfb5eb4e63729be71c92c6622410c44691c 100644 (file)
@@ -264,6 +264,14 @@ CODE_FRAGMENT
 .     sections.  *}
 .#define SEC_COFF_SHARED_LIBRARY 0x800
 .
+.  {* The section has GOT references.  This flag is only for the
+.     linker, and is currently only used by the elf32-hppa back end.
+.     It will be set if global offset table references were detected
+.     in this section, which indicate to the linker that the section
+.     contains PIC code, and must be handled specially when doing a
+.     static link.  *}
+.#define SEC_HAS_GOT_REF 0x4000
+.
 .  {* 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
@@ -363,6 +371,9 @@ CODE_FRAGMENT
 .  {* A mark flag used by some linker backends for garbage collection.  *}
 .  unsigned int gc_mark : 1;
 .
+.  {* Used by the ELF code to mark sections which have been allocated to segments.  *}
+.  unsigned int segment_mark : 1;
+.
 .  {* End of internal packed boolean fields.  *}
 .
 .  {*  The virtual memory address of the section - where it will be
@@ -549,17 +560,17 @@ static const asymbol global_syms[] =
   GLOBAL_SYM_INIT (BFD_IND_SECTION_NAME, &bfd_ind_section)
 };
 
-#define STD_SECTION(SEC, FLAGS, SYM, NAME, IDX)        \
-  const asymbol * const SYM = (asymbol *) &global_syms[IDX]; \
-  const asection SEC = \
-    /* name, id,       index, next, flags, user_set_vma, reloc_done, */        \
-    { NAME,  -1-(IDX), 0,     NULL, FLAGS, 0,            0,            \
+#define STD_SECTION(SEC, FLAGS, SYM, NAME, IDX)                                \
+  const asymbol * const SYM = (asymbol *) &global_syms[IDX];           \
+  const asection SEC =                                                         \
+    /* name, id,  index, next, flags, user_set_vma, reloc_done,      */        \
+    { NAME,  IDX, 0,     NULL, FLAGS, 0,            0,                 \
                                                                        \
-    /* linker_mark, gc_mark, vma, lma, _cooked_size, _raw_size,      */        \
-       0,           0,       0,   0,   0,            0,                        \
+    /* linker_mark, gc_mark, segment_mark, vma, lma, _cooked_size,   */        \
+       0,           0,       0,            0,   0,   0,                \
                                                                        \
-    /* output_offset, output_section,      alignment_power,          */        \
-       0,             (struct sec *) &SEC, 0,                          \
+    /* _raw_size, output_offset, output_section,    alignment_power, */ \
+       0,         0,           (struct sec *) &SEC, 0,                 \
                                                                        \
     /* relocation, orelocation, reloc_count, filepos, rel_filepos,   */        \
        NULL,       NULL,        0,           0,       0,               \
@@ -632,6 +643,55 @@ bfd_get_section_by_name (abfd, name)
 }
 
 
+/*
+FUNCTION
+       bfd_get_unique_section_name
+
+SYNOPSIS
+       char *bfd_get_unique_section_name(bfd *abfd,
+                                         const char *template,
+                                         int *count);
+
+DESCRIPTION
+       Invent a section name that is unique in @var{abfd} by tacking
+       a digit suffix onto the original @var{template}.  If @var{count}
+       is non-NULL, then it specifies the first number tried as a
+       suffix to generate a unique name.  The value pointed to by
+       @var{count} will be incremented in this case.
+*/
+
+char *
+bfd_get_unique_section_name (abfd, template, count)
+     bfd *abfd;
+     const char *template;
+     int *count;
+{
+  int num;
+  unsigned int len;
+  char *sname;
+
+  len = strlen (template);
+  sname = bfd_malloc (len + 7);
+  strcpy (sname, template);
+  num = 1;
+  if (count != NULL)
+    num = *count;
+
+  do
+    {
+      /* If we have a million sections, something is badly wrong.  */
+      if (num > 999999)
+       abort ();
+      sprintf (sname + len, "%d", num++);
+    }
+  while (bfd_get_section_by_name (abfd, sname) != NULL);
+
+  if (count != NULL)
+    *count = num;
+  return sname;
+}
+
+
 /*
 FUNCTION
        bfd_make_section_old_way
@@ -693,7 +753,7 @@ bfd_make_section_anyway (abfd, name)
      bfd *abfd;
      const char *name;
 {
-  static int section_id = 0;
+  static int section_id = 0x10;  /* id 0 to 3 used by STD_SECTION.  */
   asection *newsect;
   asection **prev = &abfd->sections;
   asection *sect = abfd->sections;
This page took 0.025099 seconds and 4 git commands to generate.