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