ELF/BFD: Hold the number of internal static relocs in `->reloc_count'
[deliverable/binutils-gdb.git] / bfd / elf.c
index 33fb4d2c3435c15e33c2bc10a3dc025a7470a8a8..b0da500dc7aa4846da6f3482a3344687ff3431b7 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -339,7 +339,8 @@ bfd_elf_string_from_elf_section (bfd *abfd,
        {
          /* PR 17512: file: f057ec89.  */
          /* xgettext:c-format */
-         _bfd_error_handler (_("%B: attempt to load strings from a non-string section (number %d)"),
+         _bfd_error_handler (_("%B: attempt to load strings from"
+                               " a non-string section (number %d)"),
                              abfd, shindex);
          return NULL;
        }
@@ -492,8 +493,8 @@ bfd_elf_get_elf_syms (bfd *ibfd,
       {
        symoffset += (esym - (bfd_byte *) extsym_buf) / extsym_size;
        /* xgettext:c-format */
-       _bfd_error_handler (_("%B symbol number %lu references "
-                             "nonexistent SHT_SYMTAB_SHNDX section"),
+       _bfd_error_handler (_("%B symbol number %lu references"
+                             " nonexistent SHT_SYMTAB_SHNDX section"),
                            ibfd, (unsigned long) symoffset);
        if (alloc_intsym != NULL)
          free (alloc_intsym);
@@ -649,7 +650,8 @@ setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
                    {
                      _bfd_error_handler
                        /* xgettext:c-format */
-                       (_("%B: corrupt size field in group section header: 0x%lx"), abfd, shdr->sh_size);
+                       (_("%B: corrupt size field in group section"
+                          " header: 0x%lx"), abfd, shdr->sh_size);
                      bfd_set_error (bfd_error_bad_value);
                      -- num_group;
                      continue;
@@ -663,11 +665,13 @@ setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
                    {
                      _bfd_error_handler
                        /* xgettext:c-format */
-                       (_("%B: invalid size field in group section header: 0x%lx"), abfd, shdr->sh_size);
+                       (_("%B: invalid size field in group section"
+                          " header: 0x%lx"), abfd, shdr->sh_size);
                      bfd_set_error (bfd_error_bad_value);
                      -- num_group;
-                     /* PR 17510: If the group contents are even partially
-                        corrupt, do not allow any of the contents to be used.  */
+                     /* PR 17510: If the group contents are even
+                        partially corrupt, do not allow any of the
+                        contents to be used.  */
                      memset (shdr->contents, 0, amt);
                      continue;
                    }
@@ -836,7 +840,7 @@ _bfd_elf_setup_sections (bfd *abfd)
                  _bfd_error_handler
                    /* xgettext:c-format */
                    (_("%B: sh_link [%d] in section `%A' is incorrect"),
-                    s->owner, s, elfsec);
+                    s->owner, elfsec, s);
                  result = FALSE;
                }
 
@@ -894,14 +898,14 @@ _bfd_elf_setup_sections (bfd *abfd)
            /* There are some unknown sections in the group.  */
            _bfd_error_handler
              /* xgettext:c-format */
-             (_("%B: unknown [%d] section `%s' in group [%s]"),
+             (_("%B: unknown [%d] section `%s' in group [%A]"),
               abfd,
               (unsigned int) idx->shdr->sh_type,
               bfd_elf_string_from_elf_section (abfd,
                                                (elf_elfheader (abfd)
                                                 ->e_shstrndx),
                                                idx->shdr->sh_name),
-              shdr->bfd_section->name);
+              shdr->bfd_section);
            result = FALSE;
          }
     }
@@ -2085,7 +2089,8 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
        {
          _bfd_error_handler
            /* xgettext:c-format */
-           (_("%B: warning: multiple symbol tables detected - ignoring the table in section %u"),
+           (_("%B: warning: multiple symbol tables detected"
+              " - ignoring the table in section %u"),
             abfd, shindex);
          goto success;
        }
@@ -2168,7 +2173,8 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
        {
          _bfd_error_handler
            /* xgettext:c-format */
-           (_("%B: warning: multiple dynamic symbol tables detected - ignoring the table in section %u"),
+           (_("%B: warning: multiple dynamic symbol tables detected"
+              " - ignoring the table in section %u"),
             abfd, shindex);
          goto success;
        }
@@ -2368,7 +2374,8 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
        *hdr2 = *hdr;
        *p_hdr = hdr2;
        elf_elfsections (abfd)[shindex] = hdr2;
-       target_sect->reloc_count += NUM_SHDR_ENTRIES (hdr);
+       target_sect->reloc_count += (NUM_SHDR_ENTRIES (hdr)
+                                    * bed->s->int_rels_per_ext_rel);
        target_sect->flags |= SEC_RELOC;
        target_sect->relocation = NULL;
        target_sect->rel_filepos = hdr->sh_offset;
@@ -2601,9 +2608,9 @@ static const struct bfd_elf_special_section special_sections_d[] =
 
 static const struct bfd_elf_special_section special_sections_f[] =
 {
-  { STRING_COMMA_LEN (".fini"),       0, SHT_PROGBITS,   SHF_ALLOC + SHF_EXECINSTR },
-  { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY, SHF_ALLOC + SHF_WRITE },
-  { NULL,                          0, 0, 0,              0 }
+  { STRING_COMMA_LEN (".fini"),        0, SHT_PROGBITS,   SHF_ALLOC + SHF_EXECINSTR },
+  { STRING_COMMA_LEN (".fini_array"), -2, SHT_FINI_ARRAY, SHF_ALLOC + SHF_WRITE },
+  { NULL,                          0 , 0, 0,              0 }
 };
 
 static const struct bfd_elf_special_section special_sections_g[] =
@@ -2628,10 +2635,10 @@ static const struct bfd_elf_special_section special_sections_h[] =
 
 static const struct bfd_elf_special_section special_sections_i[] =
 {
-  { STRING_COMMA_LEN (".init"),       0, SHT_PROGBITS,   SHF_ALLOC + SHF_EXECINSTR },
-  { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY, SHF_ALLOC + SHF_WRITE },
-  { STRING_COMMA_LEN (".interp"),     0, SHT_PROGBITS,   0 },
-  { NULL,                      0,     0, 0,              0 }
+  { STRING_COMMA_LEN (".init"),        0, SHT_PROGBITS,   SHF_ALLOC + SHF_EXECINSTR },
+  { STRING_COMMA_LEN (".init_array"), -2, SHT_INIT_ARRAY, SHF_ALLOC + SHF_WRITE },
+  { STRING_COMMA_LEN (".interp"),      0, SHT_PROGBITS,   0 },
+  { NULL,                      0,      0, 0,              0 }
 };
 
 static const struct bfd_elf_special_section special_sections_l[] =
@@ -2649,9 +2656,9 @@ static const struct bfd_elf_special_section special_sections_n[] =
 
 static const struct bfd_elf_special_section special_sections_p[] =
 {
-  { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_WRITE },
-  { STRING_COMMA_LEN (".plt"),           0, SHT_PROGBITS,      SHF_ALLOC + SHF_EXECINSTR },
-  { NULL,                   0,           0, 0,                 0 }
+  { STRING_COMMA_LEN (".preinit_array"), -2, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_WRITE },
+  { STRING_COMMA_LEN (".plt"),            0, SHT_PROGBITS,      SHF_ALLOC + SHF_EXECINSTR },
+  { NULL,                   0,            0, 0,                 0 }
 };
 
 static const struct bfd_elf_special_section special_sections_r[] =
@@ -3213,7 +3220,7 @@ elf_fake_sections (bfd *abfd, asection *asect, void *fsarg)
       _bfd_error_handler
        /* xgettext:c-format */
        (_("%B: error: Alignment power %d of section `%A' is too big"),
-        abfd, asect, asect->alignment_power);
+        abfd, asect->alignment_power, asect);
       arg->failed = TRUE;
       return;
     }
@@ -3532,17 +3539,39 @@ bfd_elf_set_group_contents (bfd *abfd, asection *sec, void *failedptrarg)
   H_PUT_32 (abfd, sec->flags & SEC_LINK_ONCE ? GRP_COMDAT : 0, loc);
 }
 
-/* Return the section which RELOC_SEC applies to.  */
+/* Given NAME, the name of a relocation section stripped of its
+   .rel/.rela prefix, return the section in ABFD to which the
+   relocations apply.  */
 
 asection *
-_bfd_elf_get_reloc_section (asection *reloc_sec)
+_bfd_elf_plt_get_reloc_section (bfd *abfd, const char *name)
+{
+  /* If a target needs .got.plt section, relocations in rela.plt/rel.plt
+     section likely apply to .got.plt or .got section.  */
+  if (get_elf_backend_data (abfd)->want_got_plt
+      && strcmp (name, ".plt") == 0)
+    {
+      asection *sec;
+
+      name = ".got.plt";
+      sec = bfd_get_section_by_name (abfd, name);
+      if (sec != NULL)
+       return sec;
+      name = ".got";
+    }
+
+  return bfd_get_section_by_name (abfd, name);
+}
+
+/* Return the section to which RELOC_SEC applies.  */
+
+static asection *
+elf_get_reloc_section (asection *reloc_sec)
 {
   const char *name;
   unsigned int type;
   bfd *abfd;
-
-  if (reloc_sec == NULL)
-    return NULL;
+  const struct elf_backend_data *bed;
 
   type = elf_section_data (reloc_sec)->this_hdr.sh_type;
   if (type != SHT_REL && type != SHT_RELA)
@@ -3550,28 +3579,15 @@ _bfd_elf_get_reloc_section (asection *reloc_sec)
 
   /* We look up the section the relocs apply to by name.  */
   name = reloc_sec->name;
-  if (type == SHT_REL)
-    name += 4;
-  else
-    name += 5;
+  if (strncmp (name, ".rel", 4) != 0)
+    return NULL;
+  name += 4;
+  if (type == SHT_RELA && *name++ != 'a')
+    return NULL;
 
-  /* If a target needs .got.plt section, relocations in rela.plt/rel.plt
-     section apply to .got.plt section.  */
   abfd = reloc_sec->owner;
-  if (get_elf_backend_data (abfd)->want_got_plt
-      && strcmp (name, ".plt") == 0)
-    {
-      /* .got.plt is a linker created input section.  It may be mapped
-        to some other output section.  Try two likely sections.  */
-      name = ".got.plt";
-      reloc_sec = bfd_get_section_by_name (abfd, name);
-      if (reloc_sec != NULL)
-       return reloc_sec;
-      name = ".got";
-    }
-
-  reloc_sec = bfd_get_section_by_name (abfd, name);
-  return reloc_sec;
+  bed = get_elf_backend_data (abfd);
+  return bed->get_reloc_section (abfd, name);
 }
 
 /* Assign all ELF section numbers.  The dummy first section is handled here
@@ -3769,7 +3785,8 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
                      asection *kept;
                      _bfd_error_handler
                        /* xgettext:c-format */
-                       (_("%B: sh_link of section `%A' points to discarded section `%A' of `%B'"),
+                       (_("%B: sh_link of section `%A' points to"
+                          " discarded section `%A' of `%B'"),
                         abfd, d->this_hdr.bfd_section,
                         s, s->owner);
                      /* Point to the kept section if it has the same
@@ -3793,7 +3810,8 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
                    {
                      _bfd_error_handler
                        /* xgettext:c-format */
-                       (_("%B: sh_link of section `%A' points to removed section `%A' of `%B'"),
+                       (_("%B: sh_link of section `%A' points to"
+                          " removed section `%A' of `%B'"),
                         abfd, d->this_hdr.bfd_section, s, s->owner);
                      bfd_set_error (bfd_error_bad_value);
                      return FALSE;
@@ -3833,7 +3851,7 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
          if (s != NULL)
            d->this_hdr.sh_link = elf_section_data (s)->this_idx;
 
-         s = get_elf_backend_data (abfd)->get_reloc_section (sec);
+         s = elf_get_reloc_section (sec);
          if (s != NULL)
            {
              d->this_hdr.sh_info = elf_section_data (s)->this_idx;
@@ -4330,9 +4348,33 @@ get_program_header_size (bfd *abfd, struct bfd_link_info *info)
        }
     }
 
-  /* Let the backend count up any program headers it might need.  */
   bed = get_elf_backend_data (abfd);
-  if (bed->elf_backend_additional_program_headers)
+
+ if ((abfd->flags & D_PAGED) != 0)
+   {
+     /* Add a PT_GNU_MBIND segment for each mbind section.  */
+     unsigned int page_align_power = bfd_log2 (bed->commonpagesize);
+     for (s = abfd->sections; s != NULL; s = s->next)
+       if (elf_section_flags (s) & SHF_GNU_MBIND)
+        {
+          if (elf_section_data (s)->this_hdr.sh_info
+              > PT_GNU_MBIND_NUM)
+            {
+              _bfd_error_handler
+                /* xgettext:c-format */
+                (_("%B: GNU_MBIN section `%A' has invalid sh_info field: %d"),
+                    abfd, s, elf_section_data (s)->this_hdr.sh_info);
+              continue;
+            }
+          /* Align mbind section to page size.  */
+          if (s->alignment_power < page_align_power)
+            s->alignment_power = page_align_power;
+          segs ++;
+        }
+   }
+
+ /* Let the backend count up any program headers it might need.  */
+ if (bed->elf_backend_additional_program_headers)
     {
       int a;
 
@@ -4504,6 +4546,7 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
       bfd_boolean writable;
       int tls_count = 0;
       asection *first_tls = NULL;
+      asection *first_mbind = NULL;
       asection *dynsec, *eh_frame_hdr;
       bfd_size_type amt;
       bfd_vma addr_mask, wrap_to = 0;
@@ -4836,6 +4879,9 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
                first_tls = s;
              tls_count++;
            }
+         if (first_mbind == NULL
+             && (elf_section_flags (s) & SHF_GNU_MBIND) != 0)
+           first_mbind = s;
        }
 
       /* If there are any SHF_TLS output sections, add PT_TLS segment.  */
@@ -4883,6 +4929,35 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
          pm = &m->next;
        }
 
+      if (first_mbind && (abfd->flags & D_PAGED) != 0)
+       for (s = first_mbind; s != NULL; s = s->next)
+         if ((elf_section_flags (s) & SHF_GNU_MBIND) != 0
+             && (elf_section_data (s)->this_hdr.sh_info
+                 <= PT_GNU_MBIND_NUM))
+           {
+             /* Mandated PF_R.  */
+             unsigned long p_flags = PF_R;
+             if ((s->flags & SEC_READONLY) == 0)
+               p_flags |= PF_W;
+             if ((s->flags & SEC_CODE) != 0)
+               p_flags |= PF_X;
+
+             amt = sizeof (struct elf_segment_map) + sizeof (asection *);
+             m = bfd_zalloc (abfd, amt);
+             if (m == NULL)
+               goto error_return;
+             m->next = NULL;
+             m->p_type = (PT_GNU_MBIND_LO
+                          + elf_section_data (s)->this_hdr.sh_info);
+             m->count = 1;
+             m->p_flags_valid = 1;
+             m->sections[0] = s;
+             m->p_flags = p_flags;
+
+             *pm = m;
+             pm = &m->next;
+           }
+
       /* If there is a .eh_frame_hdr section, throw in a PT_GNU_EH_FRAME
         segment.  */
       eh_frame_hdr = elf_eh_frame_hdr (abfd);
@@ -5125,6 +5200,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
   Elf_Internal_Phdr *p;
   file_ptr off;
   bfd_size_type maxpagesize;
+  unsigned int pt_load_count = 0;
   unsigned int alloc;
   unsigned int i, j;
   bfd_vma header_pad = 0;
@@ -5252,6 +5328,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
            maxpagesize = m->p_align;
 
          p->p_align = maxpagesize;
+         pt_load_count += 1;
        }
       else if (m->p_align_valid)
        p->p_align = m->p_align;
@@ -5303,6 +5380,15 @@ assign_file_positions_for_load_sections (bfd *abfd,
              }
 
          off_adjust = vma_page_aligned_bias (p->p_vaddr, off, align);
+
+         /* Broken hardware and/or kernel require that files do not
+            map the same page with different permissions on some hppa
+            processors.  */
+         if (pt_load_count > 1
+             && bed->no_page_alias
+             && (off & (maxpagesize - 1)) != 0
+             && (off & -maxpagesize) == ((off + off_adjust) & -maxpagesize))
+           off_adjust += maxpagesize;
          off += off_adjust;
          if (no_contents)
            {
@@ -5325,7 +5411,8 @@ assign_file_positions_for_load_sections (bfd *abfd,
               && strcmp (m->sections[0]->name, ".dynamic") != 0)
        {
          _bfd_error_handler
-           (_("%B: The first section in the PT_DYNAMIC segment is not the .dynamic section"),
+           (_("%B: The first section in the PT_DYNAMIC segment"
+              " is not the .dynamic section"),
             abfd);
          bfd_set_error (bfd_error_bad_value);
          return FALSE;
@@ -5352,7 +5439,8 @@ assign_file_positions_for_load_sections (bfd *abfd,
                      && p->p_paddr < (bfd_vma) off))
                {
                  _bfd_error_handler
-                   (_("%B: Not enough room for program headers, try linking with -N"),
+                   (_("%B: Not enough room for program headers,"
+                      " try linking with -N"),
                     abfd);
                  bfd_set_error (bfd_error_bad_value);
                  return FALSE;
@@ -6678,11 +6766,16 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
          /* Special segments, such as the PT_PHDR segment, may contain
             no sections, but ordinary, loadable segments should contain
             something.  They are allowed by the ELF spec however, so only
-            a warning is produced.  */
-         if (segment->p_type == PT_LOAD)
+            a warning is produced.  
+            There is however the valid use case of embedded systems which
+            have segments with p_filesz of 0 and a p_memsz > 0 to initialize
+            flash memory with zeros.  No warning is shown for that case.  */
+         if (segment->p_type == PT_LOAD
+             && (segment->p_filesz > 0 || segment->p_memsz == 0))
+           /* xgettext:c-format */
            _bfd_error_handler (_("\
-%B: warning: Empty loadable segment detected, is this intentional ?"),
-                               ibfd);
+%B: warning: Empty loadable segment detected at vaddr=0x%.8x, is this intentional ?"),
+                               ibfd, segment->p_vaddr);
 
          map->count = 0;
          *pointer_to_map = map;
@@ -7266,7 +7359,7 @@ copy_private_bfd_data (bfd *ibfd, bfd *obfd)
       for (section = obfd->sections; section != NULL;
           section = section->next)
        {
-         if (section->segment_mark == FALSE)
+         if (!section->segment_mark)
            goto rewrite;
          else
            section->segment_mark = FALSE;
@@ -7343,6 +7436,11 @@ _bfd_elf_init_private_section_data (bfd *ibfd,
   elf_section_flags (osec) |= (elf_section_flags (isec)
                               & (SHF_MASKOS | SHF_MASKPROC));
 
+  /* Copy sh_info from input for mbind section.  */
+  if (elf_section_flags (isec) & SHF_GNU_MBIND)
+    elf_section_data (osec)->this_hdr.sh_info
+      = elf_section_data (isec)->this_hdr.sh_info;
+
   /* Set things up for objcopy and relocatable link.  The output
      SHT_GROUP section will have its elf_next_in_group pointing back
      to the input group members.  Ignore linker created group section.
@@ -9675,6 +9773,9 @@ elfobj_grok_gnu_note (bfd *abfd, Elf_Internal_Note *note)
     default:
       return TRUE;
 
+    case NT_GNU_PROPERTY_TYPE_0:
+      return _bfd_elf_parse_gnu_properties (abfd, note);
+
     case NT_GNU_BUILD_ID:
       return elfobj_grok_gnu_build_id (abfd, note);
     }
@@ -9714,14 +9815,14 @@ elfcore_grok_freebsd_psinfo (bfd *abfd, Elf_Internal_Note *note)
 {
   size_t offset;
 
-  switch (abfd->arch_info->bits_per_word)
+  switch (elf_elfheader (abfd)->e_ident[EI_CLASS])
     {
-    case 32:
+    case ELFCLASS32:
       if (note->descsz < 108)
        return FALSE;
       break;
 
-    case 64:
+    case ELFCLASS64:
       if (note->descsz < 120)
        return FALSE;
       break;
@@ -9736,7 +9837,7 @@ elfcore_grok_freebsd_psinfo (bfd *abfd, Elf_Internal_Note *note)
   offset = 4;
 
   /* Skip over pr_psinfosz. */
-  if (abfd->arch_info->bits_per_word == 32)
+  if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS32)
     offset += 4;
   else
     {
@@ -9779,13 +9880,13 @@ elfcore_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note)
   offset = 4;
 
   /* Skip over pr_statussz.  */
-  switch (abfd->arch_info->bits_per_word)
+  switch (elf_elfheader (abfd)->e_ident[EI_CLASS])
     {
-    case 32:
+    case ELFCLASS32:
       offset += 4;
       break;
 
-    case 64:
+    case ELFCLASS64:
       offset += 4;     /* Padding before pr_statussz. */
       offset += 8;
       break;
@@ -9795,13 +9896,16 @@ elfcore_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note)
     }
 
   /* Extract size of pr_reg from pr_gregsetsz.  */
-  if (abfd->arch_info->bits_per_word == 32)
+  if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS32)
     size = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
   else
     size = bfd_h_get_64 (abfd, (bfd_byte *) note->descdata + offset);
 
   /* Skip over pr_gregsetsz and pr_fpregsetsz. */
-  offset += (abfd->arch_info->bits_per_word / 8) * 2;
+  if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS32)
+    offset += 4 * 2;
+  else
+    offset += 8 * 2;
 
   /* Skip over pr_osreldate. */
   offset += 4;
@@ -9818,7 +9922,7 @@ elfcore_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note)
   offset += 4;
 
   /* Padding before pr_reg. */
-  if (abfd->arch_info->bits_per_word == 64)
+  if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
     offset += 4;
 
   /* Make a ".reg/999" section and a ".reg" section.  */
@@ -11144,9 +11248,11 @@ _bfd_elf_get_synthetic_symtab (bfd *abfd,
 
 /* It is only used by x86-64 so far.
    ??? This repeats *COM* id of zero.  sec->id is supposed to be unique,
-   but current usage would allow all of _bfd_std_section to be zero.  t*/
+   but current usage would allow all of _bfd_std_section to be zero.  */
+static const asymbol lcomm_sym
+  = GLOBAL_SYM_INIT ("LARGE_COMMON", &_bfd_elf_large_com_section);
 asection _bfd_elf_large_com_section
-  = BFD_FAKE_SECTION (_bfd_elf_large_com_section, NULL,
+  = BFD_FAKE_SECTION (_bfd_elf_large_com_section, &lcomm_sym,
                      "LARGE_COMMON", 0, SEC_IS_COMMON);
 
 void
This page took 0.031524 seconds and 4 git commands to generate.