• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Create new section, which is member of a group, in output file.
2    Copyright (C) 2002 Red Hat, Inc.
3    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
4 
5    This program is Open Source software; you can redistribute it and/or
6    modify it under the terms of the Open Software License version 1.0 as
7    published by the Open Source Initiative.
8 
9    You should have received a copy of the Open Software License along
10    with this program; if not, you may obtain a copy of the Open Software
11    License version 1.0 from http://www.opensource.org/licenses/osl.php or
12    by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
13    3001 King Ranch Road, Ukiah, CA 95482.   */
14 
15 #ifdef HAVE_CONFIG_H
16 # include <config.h>
17 #endif
18 
19 #include <assert.h>
20 
21 #include "libasmP.h"
22 
23 
24 AsmScn_t *
asm_newscn_ingrp(ctx,scnname,type,flags,grp)25 asm_newscn_ingrp (ctx, scnname, type, flags, grp)
26      AsmCtx_t *ctx;
27      const char *scnname;
28      GElf_Word type;
29      GElf_Xword flags;
30      AsmScnGrp_t *grp;
31 {
32   AsmScn_t *result = __asm_newscn_internal (ctx, scnname, type, flags);
33 
34   if (likely (result != NULL))
35     {
36       /* We managed to create a section group.  Add it to the section
37 	 group.  */
38       if (grp->nmembers == 0)
39 	{
40 	  assert (grp->members == NULL);
41 	  grp->members = result->data.main.next_in_group = result;
42 	}
43       else
44 	{
45 	  result->data.main.next_in_group
46 	    = grp->members->data.main.next_in_group;
47 	  grp->members = grp->members->data.main.next_in_group = result;
48 	}
49 
50       ++grp->nmembers;
51 
52       /* Set the SHF_GROUP flag.  */
53       if (likely (! ctx->textp))
54 	{
55 	  GElf_Shdr shdr_mem;
56 	  GElf_Shdr *shdr = gelf_getshdr (result->data.main.scn, &shdr_mem);
57 
58 	  assert (shdr != NULL);
59 	  shdr->sh_flags |= SHF_GROUP;
60 
61 	  (void) gelf_update_shdr (result->data.main.scn, shdr);
62 	}
63     }
64 
65   return result;
66 }
67