Fri Oct 23 08:15:56 1992 Ian Lance Taylor (ian@cygnus.com)
[deliverable/binutils-gdb.git] / bfd / seclet.c
CommitLineData
2afc285d
PB
1/* seclet.c
2 Copyright (C) 1992 Free Software Foundation, Inc.
3 Written by Cygnus Support.
4
5This file is part of BFD, the Binary File Descriptor library.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
e98e6ec1
SC
21/* This module is part of BFD */
22
23
24/* The intention is that one day, all the code which uses sections
25 will change and use seclets instead - maybe seglet would have been
26 a better name..
27
28 Anyway, a seclet contains enough info to be able to describe an
29 area of output memory in one go.
30
31 The only description so far catered for is that of the
32 <<bfd_indirect_seclet>>, which is a select which points to a
33 <<section>> and the <<asymbols>> associated with the section, so
34 that relocation can be done when needed.
35
36 One day there will be more types - they will at least migrate from
37 the linker's data structures - also there could be extra stuff,
38 like a bss seclet, which descibes a lump of memory as containing
39 zeros compactly, without the horrible SEC_* flag cruft.
40
41
42*/
43
44#include "bfd.h"
45#include "sysdep.h"
46#include "libbfd.h"
47#include "seclet.h"
48#include "coff/internal.h"
49bfd_seclet_type *
50DEFUN(bfd_new_seclet,(abfd, section),
51 bfd *abfd AND
52 asection *section)
53{
54 bfd_seclet_type *n = (bfd_seclet_type *)bfd_alloc(abfd, sizeof(bfd_seclet_type));
55 if (section->seclets_tail != (bfd_seclet_type *)NULL) {
56 section->seclets_tail->next = n;
57 }
58 else
59 {
60 section->seclets_head = n;
61 }
62 section->seclets_tail = n;
63
64 return n;
e98e6ec1
SC
65}
66
67
68
69
70#define MAX_ERRORS_IN_A_ROW 10
71extern bfd_error_vector_type bfd_error_vector;
e98e6ec1 72
e98e6ec1
SC
73
74void
3be56062 75DEFUN(rel,(abfd, seclet, output_section, data),
e98e6ec1
SC
76 bfd *abfd AND
77 bfd_seclet_type *seclet AND
3be56062
SC
78 asection *output_section AND
79 PTR data)
e98e6ec1 80{
2cfd0562 81
ab98fd5d 82 if (output_section->flags & SEC_HAS_CONTENTS
b58e9180
SC
83 && !(output_section->flags & SEC_NEVER_LOAD)
84 && seclet->size)
e98e6ec1 85 {
2652a49c 86 data = (PTR) bfd_get_relocated_section_contents(abfd, seclet, data);
e5932011
SC
87 if(bfd_set_section_contents(abfd,
88 output_section,
89 data,
90 seclet->offset,
91 seclet->size) == false)
92 {
93 abort();
94 }
e98e6ec1 95 }
e98e6ec1
SC
96}
97
98void
3be56062 99DEFUN(seclet_dump_seclet,(abfd, seclet, section, data),
e98e6ec1
SC
100 bfd *abfd AND
101 bfd_seclet_type *seclet AND
3be56062
SC
102 asection *section AND
103 PTR data)
e98e6ec1
SC
104{
105 switch (seclet->type)
106 {
e5932011 107 case bfd_indirect_seclet:
e98e6ec1
SC
108 /* The contents of this section come from another one somewhere
109 else */
3be56062 110 rel(abfd, seclet, section, data);
e98e6ec1 111 break;
e5932011
SC
112 case bfd_fill_seclet:
113 /* Fill in the section with us */
114 {
115 char *d = malloc(seclet->size);
116 unsigned int i;
117 for (i =0; i < seclet->size; i+=2) {
118 d[i] = seclet->u.fill.value >> 8;
119 }
120 for (i = 1; i < seclet->size; i+=2) {
121 d[i] = seclet->u.fill.value ;
122 }
123 bfd_set_section_contents(abfd, section, d, seclet->offset, seclet->size);
124
125 }
126 break;
127 default:
e98e6ec1
SC
128 abort();
129 }
e98e6ec1
SC
130}
131
132void
3be56062
SC
133DEFUN(seclet_dump,(abfd, data),
134 bfd *abfd AND
135 PTR data)
e98e6ec1
SC
136{
137 /* Write all the seclets on the bfd out, relocate etc according to the
138 rules */
139
140 asection *o = abfd->sections;
141 while (o != (asection *)NULL)
142 {
143 bfd_seclet_type *p = o->seclets_head;
144 while (p != (bfd_seclet_type *)NULL)
145 {
3be56062 146 seclet_dump_seclet(abfd, p, o, data);
e98e6ec1
SC
147 p = p ->next;
148 }
e98e6ec1
SC
149 o = o->next;
150 }
e98e6ec1 151}
This page took 0.043319 seconds and 4 git commands to generate.