]> Git Repo - binutils.git/blob - bfd/seclet.c
* bfd-in.h: Increase version number to 1.97, for consistency with ../binutils.
[binutils.git] / bfd / seclet.c
1 /* This module is part of BFD */
2
3
4 /* The intention is that one day, all the code which uses sections
5    will change and use seclets instead - maybe seglet would have been
6    a better name..
7
8    Anyway, a seclet contains enough info to be able to describe an
9    area of output memory in one go.
10
11    The only description so far catered for is that of the
12    <<bfd_indirect_seclet>>, which is a select which points to a
13    <<section>> and the <<asymbols>> associated with the section, so
14    that relocation can be done when needed.
15
16    One day there will be more types - they will at least migrate from
17    the linker's data structures - also there could be extra stuff,
18    like a bss seclet, which descibes a lump of memory as containing
19    zeros compactly, without the horrible SEC_* flag cruft.
20
21
22 */
23
24 #include "bfd.h"
25 #include "sysdep.h"
26 #include "libbfd.h"
27 #include "seclet.h"
28 #include "coff/internal.h"
29 bfd_seclet_type *
30 DEFUN(bfd_new_seclet,(abfd, section),
31       bfd *abfd AND
32       asection *section)
33 {
34   bfd_seclet_type *n = (bfd_seclet_type *)bfd_alloc(abfd, sizeof(bfd_seclet_type));
35   if (section->seclets_tail != (bfd_seclet_type *)NULL) {
36       section->seclets_tail->next = n;
37     }
38   else
39   {
40     section->seclets_head = n;
41   }
42   section->seclets_tail = n;
43
44   return n;
45 }
46
47
48
49
50 #define MAX_ERRORS_IN_A_ROW 10
51 extern bfd_error_vector_type bfd_error_vector;
52
53
54 void
55 DEFUN(rel,(abfd, seclet, output_section),
56       bfd *abfd AND
57       bfd_seclet_type *seclet AND
58       asection *output_section)
59 {
60
61   if (output_section->flags & SEC_HAS_CONTENTS )
62   {
63     bfd_byte *data = (bfd_byte *)alloca(seclet->size);
64     data = bfd_get_relocated_section_contents(abfd, seclet, data);
65     if(bfd_set_section_contents(abfd,
66                                 output_section,
67                                 data,
68                                 seclet->offset,
69                                 seclet->size) == false)
70     {
71       abort();
72     }
73
74   }
75 }
76
77 void
78 DEFUN(seclet_dump_seclet,(abfd, seclet, section),
79       bfd *abfd AND
80       bfd_seclet_type *seclet AND
81       asection *section)
82 {
83   switch (seclet->type) 
84   {
85    case bfd_indirect_seclet:
86     /* The contents of this section come from another one somewhere
87        else */
88     rel(abfd, seclet, section);
89     break;
90    case bfd_fill_seclet:
91     /* Fill in the section with us */
92    {
93      char *d = malloc(seclet->size);
94      unsigned int i;
95      for (i =0;  i < seclet->size; i+=2) {
96        d[i] = seclet->u.fill.value >> 8;
97      }
98      for (i = 1; i < seclet->size; i+=2) {
99        d[i] = seclet->u.fill.value ;
100      }
101      bfd_set_section_contents(abfd, section, d, seclet->offset, seclet->size);
102
103    }
104     break;
105    default:
106     abort();
107   }
108 }
109
110 void
111 DEFUN(seclet_dump,(abfd),
112       bfd *abfd)
113 {
114   /* Write all the seclets on the bfd out, relocate etc according to the
115      rules */
116
117   asection *o = abfd->sections;
118   while (o != (asection *)NULL) 
119   {
120     bfd_seclet_type *p = o->seclets_head;
121     while (p != (bfd_seclet_type *)NULL) 
122     {
123       seclet_dump_seclet(abfd, p, o);
124       p = p ->next;
125     }
126     o = o->next;
127   }
128 }
This page took 0.030972 seconds and 4 git commands to generate.