include/ChangeLog
[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,
2e57b2af 3 2002, 2003, 2004, 2005, 2007, 2011 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;
ae17ab41 218 tmp->spec.section_flag_list = NULL;
b34976b6 219 lang_add_wild (NULL, tmp, FALSE);
5cc18311 220
891fa266
NC
221 /* If there is an alias for this section, add it too. */
222 for (aptr = alias; aptr; aptr = aptr->next)
223 if (strcmp (aptr->alias, p->name) == 0)
b6bf44ba 224 {
1e9cc1c2 225 tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
b6bf44ba
AM
226 tmp->next = NULL;
227 tmp->spec.name = aptr->name;
228 tmp->spec.exclude_name_list = NULL;
bcaa7b3e 229 tmp->spec.sorted = none;
ae17ab41 230 tmp->spec.section_flag_list = NULL;
b34976b6 231 lang_add_wild (NULL, tmp, FALSE);
b6bf44ba 232 }
891fa266 233
1579bae1 234 lang_leave_output_section_statement (0, "*default*", NULL, NULL);
891fa266
NC
235
236 p = p->next;
252b5132 237 }
252b5132 238 }
252b5132
RH
239
240 done_tree = 1;
252b5132 241}
891fa266 242
252b5132 243void
1579bae1 244mri_load (const char *name)
252b5132
RH
245{
246 base = 0;
1579bae1 247 lang_add_input_file (name, lang_input_file_is_file_enum, NULL);
252b5132
RH
248}
249
252b5132 250void
1579bae1 251mri_order (const char *name)
252b5132 252{
e47d05ad 253 mri_add_to_list (&order, name, 0, 0, 0, 0);
252b5132
RH
254}
255
5cc18311 256void
1579bae1 257mri_alias (const char *want, const char *is, int isn)
252b5132 258{
891fa266
NC
259 if (!is)
260 {
261 char buf[20];
5cc18311 262
891fa266
NC
263 /* Some sections are digits. */
264 sprintf (buf, "%d", isn);
5cc18311 265
891fa266 266 is = xstrdup (buf);
5cc18311 267
891fa266
NC
268 if (is == NULL)
269 abort ();
270 }
5cc18311 271
e47d05ad 272 mri_add_to_list (&alias, is, 0, want, 0, 0);
252b5132
RH
273}
274
5cc18311 275void
1579bae1 276mri_name (const char *name)
252b5132 277{
891fa266 278 lang_add_output (name, 1);
252b5132
RH
279}
280
252b5132 281void
1579bae1 282mri_format (const char *name)
252b5132 283{
891fa266 284 if (strcmp (name, "S") == 0)
1579bae1 285 lang_add_output_format ("srec", NULL, NULL, 1);
5cc18311 286
891fa266 287 else if (strcmp (name, "IEEE") == 0)
1579bae1 288 lang_add_output_format ("ieee", NULL, NULL, 1);
5cc18311 289
891fa266 290 else if (strcmp (name, "COFF") == 0)
1579bae1 291 lang_add_output_format ("coff-m68k", NULL, NULL, 1);
5cc18311 292
891fa266
NC
293 else
294 einfo (_("%P%F: unknown format type %s\n"), name);
252b5132
RH
295}
296
252b5132 297void
1579bae1 298mri_public (const char *name, etree_type *exp)
252b5132 299{
2e57b2af 300 lang_add_assignment (exp_assign (name, exp));
252b5132
RH
301}
302
5cc18311 303void
1579bae1 304mri_align (const char *name, etree_type *exp)
252b5132 305{
e47d05ad 306 mri_add_to_list (&alignment, name, 0, 0, exp, 0);
252b5132
RH
307}
308
5cc18311 309void
1579bae1 310mri_alignmod (const char *name, etree_type *exp)
252b5132 311{
e47d05ad 312 mri_add_to_list (&subalignment, name, 0, 0, 0, exp);
252b5132
RH
313}
314
5cc18311 315void
1579bae1 316mri_truncate (unsigned int exp)
252b5132
RH
317{
318 symbol_truncate = exp;
319}
This page took 0.523753 seconds and 4 git commands to generate.