* ld-misc/defsym1.d: Add a -e linker command line option.
[deliverable/binutils-gdb.git] / ld / mri.c
CommitLineData
252b5132 1/* mri.c -- handle MRI style linker scripts
aef6203b 2 Copyright 1991, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000, 2001,
3db64b00 3 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
f96b4a7b 4 Contributed by Steve Chamberlain <sac@cygnus.com>.
252b5132 5
f96b4a7b 6 This file is part of the GNU Binutils.
252b5132 7
f96b4a7b
NC
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
252b5132 12
f96b4a7b
NC
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
252b5132 17
f96b4a7b
NC
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
252b5132
RH
22
23
f96b4a7b
NC
24/* This bit does the tree decoration when MRI style link scripts
25 are parsed. */
252b5132 26
5cc18311 27#include "sysdep.h"
3db64b00 28#include "bfd.h"
252b5132
RH
29#include "ld.h"
30#include "ldexp.h"
31#include "ldlang.h"
32#include "ldmisc.h"
33#include "mri.h"
df2a7313 34#include <ldgram.h>
252b5132
RH
35#include "libiberty.h"
36
e47d05ad 37struct section_name_struct {
252b5132 38 struct section_name_struct *next;
4da711b1
AM
39 const char *name;
40 const char *alias;
252b5132
RH
41 etree_type *vma;
42 etree_type *align;
43 etree_type *subalign;
44 int ok_to_load;
891fa266 45};
252b5132 46
279e75dc
BE
47static unsigned int symbol_truncate = 10000;
48static struct section_name_struct *order;
49static struct section_name_struct *only_load;
50static struct section_name_struct *address;
51static struct section_name_struct *alias;
252b5132 52
279e75dc
BE
53static struct section_name_struct *alignment;
54static struct section_name_struct *subalignment;
252b5132 55
252b5132 56static struct section_name_struct **
1579bae1 57lookup (const char *name, struct section_name_struct **list)
252b5132 58{
252b5132 59 struct section_name_struct **ptr = list;
5cc18311
KH
60
61 while (*ptr)
891fa266
NC
62 {
63 if (strcmp (name, (*ptr)->name) == 0)
64 /* If this is a match, delete it, we only keep the last instance
65 of any name. */
66 *ptr = (*ptr)->next;
67 else
68 ptr = &((*ptr)->next);
252b5132 69 }
252b5132 70
1e9cc1c2
NC
71 *ptr = (struct section_name_struct *)
72 xmalloc (sizeof (struct section_name_struct));
252b5132
RH
73 return ptr;
74}
75
76static void
1579bae1
AM
77mri_add_to_list (struct section_name_struct **list,
78 const char *name,
79 etree_type *vma,
80 const char *zalias,
81 etree_type *align,
82 etree_type *subalign)
252b5132 83{
e47d05ad 84 struct section_name_struct **ptr = lookup (name, list);
5cc18311 85
252b5132
RH
86 (*ptr)->name = name;
87 (*ptr)->vma = vma;
1579bae1 88 (*ptr)->next = NULL;
252b5132
RH
89 (*ptr)->ok_to_load = 0;
90 (*ptr)->alias = zalias;
91 (*ptr)->align = align;
92 (*ptr)->subalign = subalign;
93}
94
252b5132 95void
1579bae1 96mri_output_section (const char *name, etree_type *vma)
252b5132 97{
e47d05ad 98 mri_add_to_list (&address, name, vma, 0, 0, 0);
252b5132
RH
99}
100
891fa266
NC
101/* If any ABSOLUTE <name> are in the script, only load those files
102 marked thus. */
252b5132
RH
103
104void
1579bae1 105mri_only_load (const char *name)
252b5132 106{
e47d05ad 107 mri_add_to_list (&only_load, name, 0, 0, 0, 0);
252b5132
RH
108}
109
252b5132 110void
1579bae1 111mri_base (etree_type *exp)
252b5132
RH
112{
113 base = exp;
114}
115
116static int done_tree = 0;
117
118void
1579bae1 119mri_draw_tree (void)
252b5132 120{
891fa266
NC
121 if (done_tree)
122 return;
123
891fa266 124 /* Now build the statements for the ldlang machine. */
252b5132 125
396a2467 126 /* Attach the addresses of any which have addresses,
891fa266 127 and add the ones not mentioned. */
1579bae1 128 if (address != NULL)
252b5132 129 {
891fa266
NC
130 struct section_name_struct *alist;
131 struct section_name_struct *olist;
5cc18311 132
1579bae1 133 if (order == NULL)
891fa266
NC
134 order = address;
135
136 for (alist = address;
1579bae1 137 alist != NULL;
5cc18311 138 alist = alist->next)
252b5132 139 {
891fa266 140 int done = 0;
5cc18311 141
1579bae1 142 for (olist = order; done == 0 && olist != NULL; olist = olist->next)
891fa266 143 {
5cc18311 144 if (strcmp (alist->name, olist->name) == 0)
891fa266
NC
145 {
146 olist->vma = alist->vma;
147 done = 1;
148 }
149 }
5cc18311 150
891fa266
NC
151 if (!done)
152 {
153 /* Add this onto end of order list. */
e47d05ad 154 mri_add_to_list (&order, alist->name, alist->vma, 0, 0, 0);
891fa266 155 }
252b5132 156 }
252b5132
RH
157 }
158
252b5132
RH
159 /* If we're only supposed to load a subset of them in, then prune
160 the list. */
1579bae1 161 if (only_load != NULL)
252b5132 162 {
891fa266
NC
163 struct section_name_struct *ptr1;
164 struct section_name_struct *ptr2;
5cc18311 165
1579bae1 166 if (order == NULL)
891fa266 167 order = only_load;
5cc18311 168
891fa266 169 /* See if this name is in the list, if it is then we can load it. */
5cc18311
KH
170 for (ptr1 = only_load; ptr1; ptr1 = ptr1->next)
171 for (ptr2 = order; ptr2; ptr2 = ptr2->next)
891fa266
NC
172 if (strcmp (ptr2->name, ptr1->name) == 0)
173 ptr2->ok_to_load = 1;
252b5132 174 }
5cc18311 175 else
891fa266
NC
176 {
177 /* No only load list, so everything is ok to load. */
178 struct section_name_struct *ptr;
5cc18311 179
e47d05ad 180 for (ptr = order; ptr; ptr = ptr->next)
891fa266 181 ptr->ok_to_load = 1;
e47d05ad 182 }
252b5132 183
891fa266 184 /* Create the order of sections to load. */
1579bae1 185 if (order != NULL)
252b5132 186 {
891fa266
NC
187 /* Been told to output the sections in a certain order. */
188 struct section_name_struct *p = order;
5cc18311
KH
189
190 while (p)
891fa266
NC
191 {
192 struct section_name_struct *aptr;
193 etree_type *align = 0;
194 etree_type *subalign = 0;
b6bf44ba 195 struct wildcard_list *tmp;
5cc18311 196
891fa266 197 /* See if an alignment has been specified. */
e47d05ad 198 for (aptr = alignment; aptr; aptr = aptr->next)
891fa266 199 if (strcmp (aptr->name, p->name) == 0)
e47d05ad 200 align = aptr->align;
891fa266 201
e47d05ad 202 for (aptr = subalignment; aptr; aptr = aptr->next)
891fa266 203 if (strcmp (aptr->name, p->name) == 0)
e47d05ad 204 subalign = aptr->subalign;
891fa266
NC
205
206 if (base == 0)
e47d05ad 207 base = p->vma ? p->vma : exp_nameop (NAME, ".");
891fa266
NC
208
209 lang_enter_output_section_statement (p->name, base,
1e9cc1c2 210 p->ok_to_load ? normal_section : noload_section,
0841712e 211 align, subalign, NULL, 0);
891fa266 212 base = 0;
1e9cc1c2 213 tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
b6bf44ba
AM
214 tmp->next = NULL;
215 tmp->spec.name = p->name;
216 tmp->spec.exclude_name_list = NULL;
bcaa7b3e 217 tmp->spec.sorted = none;
b34976b6 218 lang_add_wild (NULL, tmp, FALSE);
5cc18311 219
891fa266
NC
220 /* If there is an alias for this section, add it too. */
221 for (aptr = alias; aptr; aptr = aptr->next)
222 if (strcmp (aptr->alias, p->name) == 0)
b6bf44ba 223 {
1e9cc1c2 224 tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
b6bf44ba
AM
225 tmp->next = NULL;
226 tmp->spec.name = aptr->name;
227 tmp->spec.exclude_name_list = NULL;
bcaa7b3e 228 tmp->spec.sorted = none;
b34976b6 229 lang_add_wild (NULL, tmp, FALSE);
b6bf44ba 230 }
891fa266 231
1579bae1 232 lang_leave_output_section_statement (0, "*default*", NULL, NULL);
891fa266
NC
233
234 p = p->next;
252b5132 235 }
252b5132 236 }
252b5132
RH
237
238 done_tree = 1;
252b5132 239}
891fa266 240
252b5132 241void
1579bae1 242mri_load (const char *name)
252b5132
RH
243{
244 base = 0;
1579bae1 245 lang_add_input_file (name, lang_input_file_is_file_enum, NULL);
252b5132
RH
246}
247
252b5132 248void
1579bae1 249mri_order (const char *name)
252b5132 250{
e47d05ad 251 mri_add_to_list (&order, name, 0, 0, 0, 0);
252b5132
RH
252}
253
5cc18311 254void
1579bae1 255mri_alias (const char *want, const char *is, int isn)
252b5132 256{
891fa266
NC
257 if (!is)
258 {
259 char buf[20];
5cc18311 260
891fa266
NC
261 /* Some sections are digits. */
262 sprintf (buf, "%d", isn);
5cc18311 263
891fa266 264 is = xstrdup (buf);
5cc18311 265
891fa266
NC
266 if (is == NULL)
267 abort ();
268 }
5cc18311 269
e47d05ad 270 mri_add_to_list (&alias, is, 0, want, 0, 0);
252b5132
RH
271}
272
5cc18311 273void
1579bae1 274mri_name (const char *name)
252b5132 275{
891fa266 276 lang_add_output (name, 1);
252b5132
RH
277}
278
252b5132 279void
1579bae1 280mri_format (const char *name)
252b5132 281{
891fa266 282 if (strcmp (name, "S") == 0)
1579bae1 283 lang_add_output_format ("srec", NULL, NULL, 1);
5cc18311 284
891fa266 285 else if (strcmp (name, "IEEE") == 0)
1579bae1 286 lang_add_output_format ("ieee", NULL, NULL, 1);
5cc18311 287
891fa266 288 else if (strcmp (name, "COFF") == 0)
1579bae1 289 lang_add_output_format ("coff-m68k", NULL, NULL, 1);
5cc18311 290
891fa266
NC
291 else
292 einfo (_("%P%F: unknown format type %s\n"), name);
252b5132
RH
293}
294
252b5132 295void
1579bae1 296mri_public (const char *name, etree_type *exp)
252b5132 297{
891fa266 298 lang_add_assignment (exp_assop ('=', name, exp));
252b5132
RH
299}
300
5cc18311 301void
1579bae1 302mri_align (const char *name, etree_type *exp)
252b5132 303{
e47d05ad 304 mri_add_to_list (&alignment, name, 0, 0, exp, 0);
252b5132
RH
305}
306
5cc18311 307void
1579bae1 308mri_alignmod (const char *name, etree_type *exp)
252b5132 309{
e47d05ad 310 mri_add_to_list (&subalignment, name, 0, 0, 0, exp);
252b5132
RH
311}
312
5cc18311 313void
1579bae1 314mri_truncate (unsigned int exp)
252b5132
RH
315{
316 symbol_truncate = exp;
317}
This page took 0.541007 seconds and 4 git commands to generate.