* scripttempl/i960.sc: Add CONSTRUCTORS to .data.
[deliverable/binutils-gdb.git] / ld / ldlang.c
CommitLineData
e20873a7 1/* Linker command language support.
0b2f8d2e 2 Copyright (C) 1991, 92, 93, 94 Free Software Foundation, Inc.
075d7359 3
2fa0b342
DHW
4This file is part of GLD, the Gnu Linker.
5
6GLD is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 1, or (at your option)
9any later version.
10
11GLD is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GLD; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
2fa0b342 20#include "bfd.h"
075d7359 21#include "sysdep.h"
4c2123b6 22#include "libiberty.h"
c477527c 23#include "bfdlink.h"
2fa0b342
DHW
24
25#include "ld.h"
fcf276c4 26#include "ldmain.h"
7bc4a0d7 27#include "ldgram.h"
2fa0b342 28#include "ldexp.h"
fcf276c4 29#include "ldlang.h"
8c514453 30#include "ldemul.h"
2fa0b342 31#include "ldlex.h"
3f8d46e7 32#include "ldmisc.h"
c611e285 33#include "ldctor.h"
fcf276c4 34#include "ldfile.h"
b98bd3db 35
2fa0b342 36/* FORWARDS */
e20873a7
JG
37static void print_statements PARAMS ((void));
38static void print_statement PARAMS ((lang_statement_union_type *,
075d7359 39 lang_output_section_statement_type *));
5af8e9d6
KR
40static lang_statement_union_type *new_statement PARAMS ((enum statement_enum,
41 size_t,
42 lang_statement_list_type*));
43
2fa0b342 44
d4c02e29 45/* LOCALS */
bfbdc80f 46static struct obstack stat_obstack;
075d7359 47
0b2f8d2e 48#define obstack_chunk_alloc xmalloc
bfbdc80f 49#define obstack_chunk_free free
075d7359 50static CONST char *startup_file;
d4c02e29 51static lang_statement_list_type input_file_chain;
81016051
SC
52
53/* Points to the last statement in the .data section, so we can add
54 stuff to the data section without pain */
55static lang_statement_list_type end_of_data_section_statement_list;
56
d4c02e29
SC
57static boolean placed_commons = false;
58static lang_output_section_statement_type *default_common_section;
59static boolean map_option_f;
60static bfd_vma print_dot;
61static lang_input_statement_type *first_file;
62static lang_statement_list_type lang_output_section_statement;
63static CONST char *current_target;
64static CONST char *output_target;
fcf276c4 65static int longest_section_name = 8;
d4c02e29 66static lang_statement_list_type statement_list;
ffc50032 67
9f629407
ILT
68static void print_size PARAMS ((size_t value));
69static void print_alignment PARAMS ((unsigned int value));
70static void print_fill PARAMS ((fill_type value));
71static void print_section PARAMS ((const char *name));
72static void lang_for_each_statement_worker
73 PARAMS ((void (*func) (lang_statement_union_type *),
74 lang_statement_union_type *s));
75static lang_input_statement_type *new_afile
76 PARAMS ((const char *name, lang_input_file_enum_type file_type,
193c5f93 77 const char *target, boolean add_to_list));
9f629407
ILT
78static void print_flags PARAMS ((int *ignore_flags));
79static void init_os PARAMS ((lang_output_section_statement_type *s));
80static void wild_doit PARAMS ((lang_statement_list_type *ptr,
81 asection *section,
82 lang_output_section_statement_type *output,
83 lang_input_statement_type *file));
9f629407
ILT
84static void wild_section PARAMS ((lang_wild_statement_type *ptr,
85 const char *section,
86 lang_input_statement_type *file,
87 lang_output_section_statement_type *output));
193c5f93
ILT
88static lang_input_statement_type *lookup_name PARAMS ((const char *name));
89static void load_symbols PARAMS ((lang_input_statement_type *entry));
9f629407
ILT
90static void wild PARAMS ((lang_wild_statement_type *s,
91 const char *section, const char *file,
92 const char *target,
93 lang_output_section_statement_type *output));
94static bfd *open_output PARAMS ((const char *name));
95static void ldlang_open_output PARAMS ((lang_statement_union_type *statement));
96static void open_input_bfds PARAMS ((lang_statement_union_type *statement));
97static void lang_reasonable_defaults PARAMS ((void));
98static void lang_place_undefineds PARAMS ((void));
9f629407
ILT
99static void map_input_to_output_sections
100 PARAMS ((lang_statement_union_type *s,
101 const char *target,
102 lang_output_section_statement_type *output_section_statement));
103static void print_output_section_statement
104 PARAMS ((lang_output_section_statement_type *output_section_statement));
105static void print_assignment
106 PARAMS ((lang_assignment_statement_type *assignment,
107 lang_output_section_statement_type *output_section));
108static void print_input_statement PARAMS ((lang_input_statement_type *statm));
9f629407
ILT
109static void print_input_section PARAMS ((lang_input_section_type *in));
110static void print_fill_statement PARAMS ((lang_fill_statement_type *fill));
111static void print_data_statement PARAMS ((lang_data_statement_type *data));
4fdbafb2 112static void print_reloc_statement PARAMS ((lang_reloc_statement_type *reloc));
9f629407
ILT
113static void print_padding_statement PARAMS ((lang_padding_statement_type *s));
114static void print_wild_statement
115 PARAMS ((lang_wild_statement_type *w,
116 lang_output_section_statement_type *os));
117static void print_statement PARAMS ((lang_statement_union_type *s,
118 lang_output_section_statement_type *os));
119static void print_statements PARAMS ((void));
120static bfd_vma insert_pad PARAMS ((lang_statement_union_type **this_ptr,
121 fill_type fill, unsigned int power,
122 asection *output_section_statement,
123 bfd_vma dot));
124static bfd_vma size_input_section
125 PARAMS ((lang_statement_union_type **this_ptr,
126 lang_output_section_statement_type *output_section_statement,
c477527c 127 fill_type fill, bfd_vma dot, boolean relax));
9f629407
ILT
128static bfd_vma lang_do_assignments
129 PARAMS ((lang_statement_union_type * s,
130 lang_output_section_statement_type *output_section_statement,
c477527c 131 fill_type fill,
9f629407 132 bfd_vma dot));
9f629407
ILT
133static void lang_finish PARAMS ((void));
134static void lang_check PARAMS ((void));
135static void lang_common PARAMS ((void));
c477527c 136static boolean lang_one_common PARAMS ((struct bfd_link_hash_entry *, PTR));
9f629407
ILT
137static void lang_place_orphans PARAMS ((void));
138static int topower PARAMS ((int));
139static void reset_memory_regions PARAMS ((void));
140
2fa0b342 141/* EXPORTS */
ffc50032 142lang_output_section_statement_type *abs_output_section;
d4c02e29 143lang_statement_list_type *stat_ptr = &statement_list;
a4d2a48e 144lang_statement_list_type file_chain = { 0 };
60e8a534 145static const char *entry_symbol = 0;
d4c02e29 146boolean lang_has_input_file = false;
d4c02e29
SC
147boolean had_output_filename = false;
148boolean lang_float_flag = false;
97fbbaca 149boolean delete_output_file_on_failure = false;
075d7359 150
9fce28ed
SC
151etree_type *base; /* Relocation base - or null */
152
153
b897ed67 154#if defined(__STDC__) || defined(ALMOST_STDC)
2fa0b342
DHW
155#define cat(a,b) a##b
156#else
157#define cat(a,b) a/**/b
158#endif
159
160#define new_stat(x,y) (cat(x,_type)*) new_statement(cat(x,_enum), sizeof(cat(x,_type)),y)
161
162#define outside_section_address(q) ( (q)->output_offset + (q)->output_section->vma)
163
164#define outside_symbol_address(q) ((q)->value + outside_section_address(q->section))
165
bfbdc80f 166PTR
8ddef552
DM
167stat_alloc (size)
168 size_t size;
bfbdc80f 169{
075d7359 170 return obstack_alloc (&stat_obstack, size);
bfbdc80f 171}
9f629407 172
075d7359 173static void
8ddef552
DM
174print_size (value)
175 size_t value;
3f8d46e7 176{
075d7359 177 fprintf (config.map_file, "%5x", (unsigned) value);
3f8d46e7 178}
9f629407 179
075d7359 180static void
8ddef552
DM
181print_alignment (value)
182 unsigned int value;
3f8d46e7 183{
075d7359 184 fprintf (config.map_file, "2**%1u", value);
3f8d46e7 185}
9f629407 186
075d7359 187static void
9f629407
ILT
188print_fill (value)
189 fill_type value;
3f8d46e7 190{
075d7359 191 fprintf (config.map_file, "%04x", (unsigned) value);
3f8d46e7
JG
192}
193
075d7359 194static void
8ddef552 195print_section (name)
9f629407 196 CONST char *name;
3f8d46e7 197{
075d7359 198 fprintf (config.map_file, "%*s", -longest_section_name, name);
3f8d46e7 199}
2fa0b342 200
1418c83b
SC
201/*----------------------------------------------------------------------
202 lang_for_each_statement walks the parse tree and calls the provided
203 function for each node
204*/
205
075d7359 206static void
8ddef552 207lang_for_each_statement_worker (func, s)
c477527c 208 void (*func) PARAMS ((lang_statement_union_type *));
8ddef552 209 lang_statement_union_type *s;
1418c83b 210{
075d7359
SC
211 for (; s != (lang_statement_union_type *) NULL; s = s->next)
212 {
213 func (s);
1418c83b 214
075d7359
SC
215 switch (s->header.type)
216 {
81016051 217 case lang_constructors_statement_enum:
075d7359 218 lang_for_each_statement_worker (func, constructor_list.head);
81016051 219 break;
1418c83b
SC
220 case lang_output_section_statement_enum:
221 lang_for_each_statement_worker
075d7359 222 (func,
1418c83b
SC
223 s->output_section_statement.children.head);
224 break;
225 case lang_wild_statement_enum:
226 lang_for_each_statement_worker
075d7359 227 (func,
1418c83b
SC
228 s->wild_statement.children.head);
229 break;
230 case lang_data_statement_enum:
4fdbafb2 231 case lang_reloc_statement_enum:
1418c83b
SC
232 case lang_object_symbols_statement_enum:
233 case lang_output_statement_enum:
234 case lang_target_statement_enum:
235 case lang_input_section_enum:
236 case lang_input_statement_enum:
1418c83b
SC
237 case lang_assignment_statement_enum:
238 case lang_padding_statement_enum:
239 case lang_address_statement_enum:
240 break;
241 default:
075d7359 242 FAIL ();
1418c83b
SC
243 break;
244 }
075d7359 245 }
1418c83b
SC
246}
247
248void
8ddef552 249lang_for_each_statement (func)
c477527c 250 void (*func) PARAMS ((lang_statement_union_type *));
1418c83b 251{
075d7359
SC
252 lang_for_each_statement_worker (func,
253 statement_list.head);
1418c83b 254}
075d7359 255
1418c83b 256/*----------------------------------------------------------------------*/
075d7359 257void
8ddef552
DM
258lang_list_init (list)
259 lang_statement_list_type *list;
2fa0b342 260{
075d7359
SC
261 list->head = (lang_statement_union_type *) NULL;
262 list->tail = &list->head;
2fa0b342
DHW
263}
264
1418c83b 265/*----------------------------------------------------------------------
075d7359 266
1418c83b
SC
267 build a new statement node for the parse tree
268
269 */
2fa0b342
DHW
270
271static
075d7359 272lang_statement_union_type *
8ddef552
DM
273new_statement (type, size, list)
274 enum statement_enum type;
5af8e9d6 275 size_t size;
8ddef552 276 lang_statement_list_type * list;
2fa0b342
DHW
277{
278 lang_statement_union_type *new = (lang_statement_union_type *)
075d7359
SC
279 stat_alloc (size);
280
2fa0b342 281 new->header.type = type;
075d7359
SC
282 new->header.next = (lang_statement_union_type *) NULL;
283 lang_statement_append (list, new, &new->header.next);
2fa0b342
DHW
284 return new;
285}
286
1418c83b
SC
287/*
288 Build a new input file node for the language. There are several ways
289 in which we treat an input file, eg, we only look at symbols, or
290 prefix it with a -l etc.
291
292 We can be supplied with requests for input files more than once;
293 they may, for example be split over serveral lines like foo.o(.text)
294 foo.o(.data) etc, so when asked for a file we check that we havn't
295 got it already so we don't duplicate the bfd.
296
297 */
2fa0b342 298static lang_input_statement_type *
193c5f93 299new_afile (name, file_type, target, add_to_list)
9f629407
ILT
300 CONST char *name;
301 lang_input_file_enum_type file_type;
302 CONST char *target;
193c5f93 303 boolean add_to_list;
2fa0b342 304{
193c5f93 305 lang_input_statement_type *p;
dc4726c2 306
193c5f93
ILT
307 if (add_to_list)
308 p = new_stat (lang_input_statement, stat_ptr);
309 else
310 {
311 p = ((lang_input_statement_type *)
312 stat_alloc (sizeof (lang_input_statement_type)));
313 p->header.next = NULL;
314 }
075d7359 315
2fa0b342
DHW
316 lang_has_input_file = true;
317 p->target = target;
ee4af9e8 318 p->complained = false;
075d7359
SC
319 switch (file_type)
320 {
321 case lang_input_file_is_symbols_only_enum:
322 p->filename = name;
323 p->is_archive = false;
324 p->real = true;
325 p->local_sym_name = name;
326 p->just_syms_flag = true;
327 p->search_dirs_flag = false;
328 break;
329 case lang_input_file_is_fake_enum:
330 p->filename = name;
331 p->is_archive = false;
332 p->real = false;
333 p->local_sym_name = name;
334 p->just_syms_flag = false;
335 p->search_dirs_flag = false;
336 break;
337 case lang_input_file_is_l_enum:
338 p->is_archive = true;
339 p->filename = name;
340 p->real = true;
ef76742f 341 p->local_sym_name = concat ("-l", name, (const char *) NULL);
075d7359
SC
342 p->just_syms_flag = false;
343 p->search_dirs_flag = true;
344 break;
075d7359 345 case lang_input_file_is_marker_enum:
193c5f93
ILT
346 p->filename = name;
347 p->is_archive = false;
348 p->real = false;
349 p->local_sym_name = name;
350 p->just_syms_flag = false;
351 p->search_dirs_flag = true;
352 break;
353 case lang_input_file_is_search_file_enum:
075d7359
SC
354 p->filename = name;
355 p->is_archive = false;
356 p->real = true;
357 p->local_sym_name = name;
358 p->just_syms_flag = false;
359 p->search_dirs_flag = true;
360 break;
361 case lang_input_file_is_file_enum:
362 p->filename = name;
363 p->is_archive = false;
364 p->real = true;
365 p->local_sym_name = name;
366 p->just_syms_flag = false;
367 p->search_dirs_flag = false;
368 break;
369 default:
370 FAIL ();
371 }
193c5f93 372 p->the_bfd = (bfd *) NULL;
075d7359 373 p->asymbols = (asymbol **) NULL;
075d7359
SC
374 p->next_real_file = (lang_statement_union_type *) NULL;
375 p->next = (lang_statement_union_type *) NULL;
2fa0b342 376 p->symbol_count = 0;
075d7359 377 p->common_output_section = (asection *) NULL;
5e6cd559 378 p->loaded = false;
075d7359
SC
379 lang_statement_append (&input_file_chain,
380 (lang_statement_union_type *) p,
381 &p->next_real_file);
2fa0b342
DHW
382 return p;
383}
384
385lang_input_statement_type *
8ddef552
DM
386lang_add_input_file (name, file_type, target)
387 CONST char *name;
388 lang_input_file_enum_type file_type;
389 CONST char *target;
2fa0b342 390{
1418c83b 391 lang_has_input_file = true;
193c5f93 392 return new_afile (name, file_type, target, true);
2fa0b342
DHW
393}
394
1418c83b 395/* Build enough state so that the parser can build its tree */
2fa0b342 396void
8ddef552 397lang_init ()
2fa0b342 398{
075d7359 399 obstack_begin (&stat_obstack, 1000);
2fa0b342 400
075d7359 401 stat_ptr = &statement_list;
bfbdc80f 402
075d7359 403 lang_list_init (stat_ptr);
2fa0b342 404
075d7359
SC
405 lang_list_init (&input_file_chain);
406 lang_list_init (&lang_output_section_statement);
407 lang_list_init (&file_chain);
408 first_file = lang_add_input_file ((char *) NULL,
409 lang_input_file_is_marker_enum,
410 (char *) NULL);
411 abs_output_section = lang_output_section_statement_lookup (BFD_ABS_SECTION_NAME);
9d1fe8a4 412
bfbdc80f 413 abs_output_section->bfd_section = &bfd_abs_section;
9d1fe8a4 414
2fa0b342
DHW
415}
416
1418c83b 417/*----------------------------------------------------------------------
075d7359
SC
418 A region is an area of memory declared with the
419 MEMORY { name:org=exp, len=exp ... }
420 syntax.
2fa0b342 421
1418c83b 422 We maintain a list of all the regions here
2fa0b342 423
1418c83b
SC
424 If no regions are specified in the script, then the default is used
425 which is created when looked up to be the entire data space
2fa0b342
DHW
426*/
427
428static lang_memory_region_type *lang_memory_region_list;
429static lang_memory_region_type **lang_memory_region_list_tail = &lang_memory_region_list;
430
431lang_memory_region_type *
8ddef552
DM
432lang_memory_region_lookup (name)
433 CONST char *CONST name;
2fa0b342
DHW
434{
435
075d7359
SC
436 lang_memory_region_type *p = lang_memory_region_list;
437
1418c83b 438 for (p = lang_memory_region_list;
075d7359
SC
439 p != (lang_memory_region_type *) NULL;
440 p = p->next)
441 {
442 if (strcmp (p->name, name) == 0)
443 {
444 return p;
445 }
2fa0b342 446 }
075d7359 447 if (strcmp (name, "*default*") == 0)
2fa0b342 448 {
075d7359
SC
449 /* This is the default region, dig out first one on the list */
450 if (lang_memory_region_list != (lang_memory_region_type *) NULL)
451 {
452 return lang_memory_region_list;
453 }
2fa0b342 454 }
075d7359
SC
455 {
456 lang_memory_region_type *new =
457 (lang_memory_region_type *) stat_alloc ((bfd_size_type) (sizeof (lang_memory_region_type)));
458
459 new->name = buystring (name);
460 new->next = (lang_memory_region_type *) NULL;
461
462 *lang_memory_region_list_tail = new;
463 lang_memory_region_list_tail = &new->next;
464 new->origin = 0;
8ddef552 465 new->length = ~(bfd_size_type)0;
075d7359
SC
466 new->current = 0;
467 new->had_full_message = false;
468
469 return new;
470 }
2fa0b342
DHW
471}
472
473
2fa0b342 474lang_output_section_statement_type *
8ddef552
DM
475lang_output_section_find (name)
476 CONST char *CONST name;
2fa0b342
DHW
477{
478 lang_statement_union_type *u;
479 lang_output_section_statement_type *lookup;
480
481 for (u = lang_output_section_statement.head;
075d7359 482 u != (lang_statement_union_type *) NULL;
2fa0b342 483 u = lookup->next)
075d7359
SC
484 {
485 lookup = &u->output_section_statement;
486 if (strcmp (name, lookup->name) == 0)
487 {
1418c83b
SC
488 return lookup;
489 }
075d7359
SC
490 }
491 return (lang_output_section_statement_type *) NULL;
2fa0b342
DHW
492}
493
494lang_output_section_statement_type *
8ddef552
DM
495lang_output_section_statement_lookup (name)
496 CONST char *CONST name;
2fa0b342
DHW
497{
498 lang_output_section_statement_type *lookup;
2fa0b342 499
075d7359
SC
500 lookup = lang_output_section_find (name);
501 if (lookup == (lang_output_section_statement_type *) NULL)
502 {
2fa0b342 503
075d7359
SC
504 lookup = (lang_output_section_statement_type *)
505 new_stat (lang_output_section_statement, stat_ptr);
506 lookup->region = (lang_memory_region_type *) NULL;
507 lookup->fill = 0;
508 lookup->block_value = 1;
509 lookup->name = name;
510
511 lookup->next = (lang_statement_union_type *) NULL;
512 lookup->bfd_section = (asection *) NULL;
513 lookup->processed = false;
ae475b39 514 lookup->loadable = 1;
075d7359
SC
515 lookup->addr_tree = (etree_type *) NULL;
516 lang_list_init (&lookup->children);
517
1b8a42f3
ILT
518 lookup->memspec = (CONST char *) NULL;
519 lookup->flags = 0;
520 lookup->subsection_alignment = -1;
521 lookup->section_alignment = -1;
522 lookup->load_base = (union etree_union *) NULL;
523
075d7359
SC
524 lang_statement_append (&lang_output_section_statement,
525 (lang_statement_union_type *) lookup,
526 &lookup->next);
527 }
528 return lookup;
529}
2fa0b342 530
9d1fe8a4 531/*ARGSUSED*/
2fa0b342 532static void
8ddef552
DM
533print_flags (ignore_flags)
534 int *ignore_flags;
2fa0b342 535{
075d7359 536 fprintf (config.map_file, "(");
2fa0b342 537#if 0
075d7359
SC
538 if (flags->flag_read)
539 fprintf (outfile, "R");
540 if (flags->flag_write)
541 fprintf (outfile, "W");
542 if (flags->flag_executable)
543 fprintf (outfile, "X");
544 if (flags->flag_loadable)
545 fprintf (outfile, "L");
2fa0b342 546#endif
ae475b39 547 fprintf (config.map_file, ")");
2fa0b342
DHW
548}
549
550void
8ddef552 551lang_map ()
2fa0b342
DHW
552{
553 lang_memory_region_type *m;
075d7359
SC
554
555 fprintf (config.map_file, "**MEMORY CONFIGURATION**\n\n");
48491e2e 556#ifdef HOST_64_BIT
075d7359 557 fprintf (config.map_file, "name\t\torigin\t\tlength\t\tattributes\n");
48491e2e 558#else
ae475b39
SC
559 fprintf (config.map_file,
560 "name\t\torigin length r_size c_size is attributes\n");
561
48491e2e 562#endif
2fa0b342 563 for (m = lang_memory_region_list;
075d7359
SC
564 m != (lang_memory_region_type *) NULL;
565 m = m->next)
2fa0b342 566 {
075d7359
SC
567 fprintf (config.map_file, "%-16s", m->name);
568 print_address (m->origin);
569 print_space ();
8ddef552 570 print_address ((bfd_vma)m->length);
075d7359 571 print_space ();
8ddef552 572 print_address ((bfd_vma)m->old_length);
ae475b39
SC
573 print_space();
574 print_address (m->current - m->origin);
575 print_space();
576 if (m->old_length)
fcf276c4
ILT
577 fprintf (config.map_file, " %2d%% ",
578 (int) ((m->current - m->origin) * 100 / m->old_length));
075d7359
SC
579 print_flags (&m->flags);
580 fprintf (config.map_file, "\n");
2fa0b342 581 }
075d7359
SC
582 fprintf (config.map_file, "\n\n**LINK EDITOR MEMORY MAP**\n\n");
583 fprintf (config.map_file, "output input virtual\n");
584 fprintf (config.map_file, "section section address tsize\n\n");
2fa0b342 585
075d7359 586 print_statements ();
2fa0b342
DHW
587
588}
589
590/*
591 *
592 */
075d7359 593static void
8ddef552
DM
594init_os (s)
595 lang_output_section_statement_type * s;
2fa0b342 596{
9d1fe8a4
SC
597/* asection *section = bfd_get_section_by_name(output_bfd, s->name);*/
598 section_userdata_type *new =
075d7359
SC
599 (section_userdata_type *)
600 stat_alloc ((bfd_size_type) (sizeof (section_userdata_type)));
601
602 s->bfd_section = bfd_get_section_by_name (output_bfd, s->name);
603 if (s->bfd_section == (asection *) NULL)
604 s->bfd_section = bfd_make_section (output_bfd, s->name);
605 if (s->bfd_section == (asection *) NULL)
606 {
ddddcdf0 607 einfo ("%P%F: output format %s cannot represent section called %s\n",
075d7359 608 output_bfd->xvec->name, s->name);
9d1fe8a4 609 }
2fa0b342 610 s->bfd_section->output_section = s->bfd_section;
ae475b39 611/* s->bfd_section->flags = s->flags;*/
7bc4a0d7 612
2fa0b342
DHW
613 /* We initialize an output sections output offset to minus its own */
614 /* vma to allow us to output a section through itself */
615 s->bfd_section->output_offset = 0;
075d7359 616 get_userdata (s->bfd_section) = (PTR) new;
c611e285 617
2fa0b342
DHW
618}
619
1418c83b
SC
620/***********************************************************************
621 The wild routines.
622
623 These expand statements like *(.text) and foo.o to a list of
624 explicit actions, like foo.o(.text), bar.o(.text) and
625 foo.o(.text,.data) .
626
627 The toplevel routine, wild, takes a statement, section, file and
628 target. If either the section or file is null it is taken to be the
629 wildcard. Seperate lang_input_section statements are created for
630 each part of the expanstion, and placed after the statement provided.
631
632*/
075d7359 633
2fa0b342 634static void
8ddef552
DM
635wild_doit (ptr, section, output, file)
636 lang_statement_list_type * ptr;
637 asection * section;
638 lang_output_section_statement_type * output;
639 lang_input_statement_type * file;
2fa0b342 640{
075d7359 641 if (output->bfd_section == (asection *) NULL)
ae475b39 642 init_os (output);
2fa0b342 643
075d7359
SC
644 if (section != (asection *) NULL
645 && section->output_section == (asection *) NULL)
ae475b39
SC
646 {
647 /* Add a section reference to the list */
648 lang_input_section_type *new = new_stat (lang_input_section, ptr);
649
650 new->section = section;
651 new->ifile = file;
652 section->output_section = output->bfd_section;
29f33467 653
27f7237e
ILT
654 /* We don't copy the SEC_NEVER_LOAD flag from an input section to
655 an output section, because we want to be able to include a
656 SEC_NEVER_LOAD section in the middle of an otherwise loaded
657 section (I don't know why we want to do this, but we do).
658 build_link_order in ldwrite.c handles this case by turning the
659 embedded SEC_NEVER_LOAD section into a fill. */
660 section->output_section->flags |=
661 section->flags & (flagword) (~ SEC_NEVER_LOAD);
29f33467 662
ae475b39 663 if (!output->loadable)
075d7359 664 {
29f33467 665 /* Turn off load flag */
ae475b39 666 output->bfd_section->flags &= ~SEC_LOAD;
29f33467 667 output->bfd_section->flags |= SEC_NEVER_LOAD;
ae475b39
SC
668 }
669 if (section->alignment_power > output->bfd_section->alignment_power)
670 {
671 output->bfd_section->alignment_power = section->alignment_power;
075d7359 672 }
e20873a7
JG
673 /* If supplied an aligmnet, then force it */
674 if (output->section_alignment != -1)
675 {
676 output->bfd_section->alignment_power = output->section_alignment;
677 }
ae475b39 678 }
2fa0b342
DHW
679}
680
075d7359 681static void
8ddef552
DM
682wild_section (ptr, section, file, output)
683 lang_wild_statement_type * ptr;
684 CONST char *section;
685 lang_input_statement_type * file;
686 lang_output_section_statement_type * output;
2fa0b342
DHW
687{
688 asection *s;
075d7359
SC
689
690 if (file->just_syms_flag == false)
691 {
692 if (section == (char *) NULL)
693 {
694 /* Do the creation to all sections in the file */
f9d3d71a 695 for (s = file->the_bfd->sections; s != NULL; s = s->next)
075d7359 696 {
f9d3d71a
ILT
697 /* except for bss */
698 if ((s->flags & SEC_IS_COMMON) == 0)
699 {
700 wild_doit (&ptr->children, s, output, file);
701 }
075d7359
SC
702 }
703 }
704 else
705 {
706 /* Do the creation to the named section only */
f9d3d71a
ILT
707 s = bfd_get_section_by_name (file->the_bfd, section);
708 if (s != NULL)
709 wild_doit (&ptr->children, s, output, file);
075d7359 710 }
2fa0b342 711 }
2fa0b342
DHW
712}
713
1418c83b
SC
714/* passed a file name (which must have been seen already and added to
715 the statement tree. We will see if it has been opened already and
716 had its symbols read. If not then we'll read it.
2fa0b342 717
1418c83b
SC
718 Archives are pecuilar here. We may open them once, but if they do
719 not define anything we need at the time, they won't have all their
720 symbols read. If we need them later, we'll have to redo it.
721 */
193c5f93
ILT
722static lang_input_statement_type *
723lookup_name (name)
9f629407 724 CONST char *name;
2fa0b342
DHW
725{
726 lang_input_statement_type *search;
075d7359
SC
727
728 for (search = (lang_input_statement_type *) input_file_chain.head;
729 search != (lang_input_statement_type *) NULL;
730 search = (lang_input_statement_type *) search->next_real_file)
731 {
732 if (search->filename == (char *) NULL && name == (char *) NULL)
c477527c
ILT
733 return search;
734 if (search->filename != (char *) NULL
735 && name != (char *) NULL
736 && strcmp (search->filename, name) == 0)
737 break;
075d7359 738 }
2fa0b342 739
c477527c 740 if (search == (lang_input_statement_type *) NULL)
193c5f93
ILT
741 search = new_afile (name, lang_input_file_is_file_enum, default_target,
742 false);
c477527c 743
5e6cd559
ILT
744 /* If we have already added this file, or this file is not real
745 (FIXME: can that ever actually happen?) or the name is NULL
746 (FIXME: can that ever actually happen?) don't add this file. */
193c5f93 747 if (search->loaded
5e6cd559
ILT
748 || ! search->real
749 || search->filename == (const char *) NULL)
750 return search;
751
193c5f93
ILT
752 load_symbols (search);
753
754 return search;
755}
756
757/* Get the symbols for an input file. */
c477527c 758
193c5f93
ILT
759static void
760load_symbols (entry)
761 lang_input_statement_type *entry;
762{
763 if (entry->loaded)
764 return;
765
766 ldfile_open_file (entry);
767
768 if (bfd_check_format (entry->the_bfd, bfd_object))
5e6cd559 769 {
193c5f93 770 ldlang_add_file (entry);
5e6cd559 771 if (trace_files || trace_file_tries)
193c5f93 772 info_msg ("%I\n", entry);
5e6cd559 773 }
193c5f93 774 else if (bfd_check_format (entry->the_bfd, bfd_archive))
c477527c
ILT
775 {
776 /* There is nothing to do here; the add_symbols routine will
777 call ldlang_add_file (via the add_archive_element callback)
778 for each element of the archive which is used. */
779 }
780 else
193c5f93 781 einfo ("%F%B: file not recognized: %E\n", entry->the_bfd);
1418c83b 782
193c5f93
ILT
783 if (bfd_link_add_symbols (entry->the_bfd, &link_info) == false)
784 einfo ("%F%B: could not read symbols: %E\n", entry->the_bfd);
5e6cd559 785
193c5f93 786 entry->loaded = true;
2fa0b342
DHW
787}
788
789static void
8ddef552
DM
790wild (s, section, file, target, output)
791 lang_wild_statement_type * s;
9f629407
ILT
792 CONST char *section;
793 CONST char *file;
794 CONST char *target;
8ddef552 795 lang_output_section_statement_type * output;
2fa0b342
DHW
796{
797 lang_input_statement_type *f;
075d7359
SC
798
799 if (file == (char *) NULL)
800 {
801 /* Perform the iteration over all files in the list */
802 for (f = (lang_input_statement_type *) file_chain.head;
803 f != (lang_input_statement_type *) NULL;
804 f = (lang_input_statement_type *) f->next)
805 {
806 wild_section (s, section, f, output);
807 }
808 }
809 else
810 {
811 /* Perform the iteration over a single file */
193c5f93 812 wild_section (s, section, lookup_name (file), output);
075d7359
SC
813 }
814 if (section != (char *) NULL
815 && strcmp (section, "COMMON") == 0
816 && default_common_section == (lang_output_section_statement_type *) NULL)
817 {
818 /* Remember the section that common is going to incase we later
819 get something which doesn't know where to put it */
820 default_common_section = output;
2fa0b342 821 }
2fa0b342
DHW
822}
823
824/*
075d7359 825 read in all the files
2fa0b342 826 */
97fbbaca 827
075d7359 828static bfd *
8ddef552 829open_output (name)
9f629407 830 CONST char *name;
2fa0b342 831{
097879bc 832 bfd *output;
097879bc 833
075d7359 834 if (output_target == (char *) NULL)
ae475b39
SC
835 {
836 if (current_target != (char *) NULL)
837 output_target = current_target;
838 else
839 output_target = default_target;
840 }
075d7359 841 output = bfd_openw (name, output_target);
075d7359
SC
842
843 if (output == (bfd *) NULL)
844 {
5bcb7f28 845 if (bfd_get_error () == bfd_error_invalid_target)
ae475b39 846 {
ddddcdf0 847 einfo ("%P%F: target %s not found\n", output_target);
ae475b39 848 }
ddddcdf0 849 einfo ("%P%F: cannot open output file %s: %E\n", name);
075d7359 850 }
30d1a390 851
97fbbaca
JL
852 delete_output_file_on_failure = 1;
853
30d1a390 854 /* output->flags |= D_PAGED;*/
075d7359 855
ddddcdf0
ILT
856 if (! bfd_set_format (output, bfd_object))
857 einfo ("%P%F:%s: can not make object file: %E\n", name);
858 if (! bfd_set_arch_mach (output,
859 ldfile_output_architecture,
860 ldfile_output_machine))
861 einfo ("%P%F:%s: can not set architecture: %E\n", name);
862
c477527c
ILT
863 link_info.hash = bfd_link_hash_table_create (output);
864 if (link_info.hash == (struct bfd_link_hash_table *) NULL)
865 einfo ("%P%F: can not create link hash table: %E\n");
866
1b8a42f3 867 bfd_set_gp_size (output, g_switch_value);
2fa0b342
DHW
868 return output;
869}
1418c83b
SC
870
871
097879bc 872
1418c83b 873
2fa0b342 874static void
8ddef552
DM
875ldlang_open_output (statement)
876 lang_statement_union_type * statement;
2fa0b342 877{
075d7359
SC
878 switch (statement->header.type)
879 {
c477527c
ILT
880 case lang_output_statement_enum:
881 ASSERT (output_bfd == (bfd *) NULL);
075d7359
SC
882 output_bfd = open_output (statement->output_statement.name);
883 ldemul_set_output_arch ();
c477527c 884 if (config.magic_demand_paged && !link_info.relocateable)
075d7359
SC
885 output_bfd->flags |= D_PAGED;
886 else
887 output_bfd->flags &= ~D_PAGED;
888 if (config.text_read_only)
889 output_bfd->flags |= WP_TEXT;
890 else
891 output_bfd->flags &= ~WP_TEXT;
892 break;
1418c83b 893
075d7359
SC
894 case lang_target_statement_enum:
895 current_target = statement->target_statement.target;
896 break;
897 default:
898 break;
899 }
1418c83b 900}
2fa0b342 901
1418c83b 902static void
8ddef552
DM
903open_input_bfds (statement)
904 lang_statement_union_type * statement;
1418c83b 905{
075d7359
SC
906 switch (statement->header.type)
907 {
1418c83b 908 case lang_target_statement_enum:
075d7359
SC
909 current_target = statement->target_statement.target;
910 break;
911 case lang_wild_statement_enum:
912 /* Maybe we should load the file's symbols */
913 if (statement->wild_statement.filename)
914 {
193c5f93 915 (void) lookup_name (statement->wild_statement.filename);
075d7359
SC
916 }
917 break;
918 case lang_input_statement_enum:
919 if (statement->input_statement.real == true)
920 {
921 statement->input_statement.target = current_target;
193c5f93 922 load_symbols (&statement->input_statement);
075d7359
SC
923 }
924 break;
925 default:
926 break;
927 }
2fa0b342 928}
075d7359 929
2fa0b342
DHW
930/* If there are [COMMONS] statements, put a wild one into the bss section */
931
932static void
075d7359 933lang_reasonable_defaults ()
2fa0b342 934{
1418c83b 935#if 0
075d7359
SC
936 lang_output_section_statement_lookup (".text");
937 lang_output_section_statement_lookup (".data");
8cb5eb31 938
075d7359
SC
939 default_common_section =
940 lang_output_section_statement_lookup (".bss");
8cb5eb31 941
1418c83b 942
075d7359
SC
943 if (placed_commons == false)
944 {
945 lang_wild_statement_type *new =
946 new_stat (lang_wild_statement,
947 &default_common_section->children);
948
949 new->section_name = "COMMON";
950 new->filename = (char *) NULL;
951 lang_list_init (&new->children);
952 }
1418c83b 953#endif
8cb5eb31 954
2fa0b342
DHW
955}
956
1418c83b
SC
957/*
958 Add the supplied name to the symbol table as an undefined reference.
959 Remove items from the chain as we open input bfds
960 */
075d7359
SC
961typedef struct ldlang_undef_chain_list
962{
f177a611 963 struct ldlang_undef_chain_list *next;
1418c83b 964 char *name;
075d7359 965} ldlang_undef_chain_list_type;
1418c83b
SC
966
967static ldlang_undef_chain_list_type *ldlang_undef_chain_list_head;
968
969void
8ddef552
DM
970ldlang_add_undef (name)
971 CONST char *CONST name;
2fa0b342 972{
1418c83b 973 ldlang_undef_chain_list_type *new =
075d7359
SC
974 (ldlang_undef_chain_list_type
975 *) stat_alloc ((bfd_size_type) (sizeof (ldlang_undef_chain_list_type)));
1418c83b
SC
976
977 new->next = ldlang_undef_chain_list_head;
978 ldlang_undef_chain_list_head = new;
979
075d7359 980 new->name = buystring (name);
1418c83b 981}
075d7359 982
1418c83b
SC
983/* Run through the list of undefineds created above and place them
984 into the linker hash table as undefined symbols belonging to the
985 script file.
986*/
987static void
8ddef552 988lang_place_undefineds ()
1418c83b 989{
c477527c 990 ldlang_undef_chain_list_type *ptr;
1418c83b 991
c477527c
ILT
992 for (ptr = ldlang_undef_chain_list_head;
993 ptr != (ldlang_undef_chain_list_type *) NULL;
994 ptr = ptr->next)
075d7359 995 {
c477527c 996 struct bfd_link_hash_entry *h;
075d7359 997
c477527c
ILT
998 h = bfd_link_hash_lookup (link_info.hash, ptr->name, true, false, true);
999 if (h == (struct bfd_link_hash_entry *) NULL)
1000 einfo ("%P%F: bfd_link_hash_lookup failed: %E");
1001 if (h->type == bfd_link_hash_new)
1002 {
1003 h->type = bfd_link_hash_undefined;
1004 h->u.undef.abfd = NULL;
1005 bfd_link_add_undef (link_info.hash, h);
1006 }
075d7359
SC
1007 }
1008}
1418c83b 1009
2fa0b342
DHW
1010/* Open input files and attatch to output sections */
1011static void
8ddef552
DM
1012map_input_to_output_sections (s, target, output_section_statement)
1013 lang_statement_union_type * s;
1014 CONST char *target;
1015 lang_output_section_statement_type * output_section_statement;
2fa0b342 1016{
075d7359 1017 for (; s != (lang_statement_union_type *) NULL; s = s->next)
2fa0b342 1018 {
075d7359 1019 switch (s->header.type)
2fa0b342 1020 {
075d7359
SC
1021
1022
1023 case lang_wild_statement_enum:
1024 wild (&s->wild_statement, s->wild_statement.section_name,
1025 s->wild_statement.filename, target,
1026 output_section_statement);
1027
1028 break;
1029 case lang_constructors_statement_enum:
1030 map_input_to_output_sections (constructor_list.head,
1031 target,
1032 output_section_statement);
1033 break;
1034 case lang_output_section_statement_enum:
1035 map_input_to_output_sections (s->output_section_statement.children.head,
1036 target,
1037 &s->output_section_statement);
1038 break;
1039 case lang_output_statement_enum:
1040 break;
1041 case lang_target_statement_enum:
1042 target = s->target_statement.target;
1043 break;
1044 case lang_fill_statement_enum:
1045 case lang_input_section_enum:
1046 case lang_object_symbols_statement_enum:
1047 case lang_data_statement_enum:
4fdbafb2 1048 case lang_reloc_statement_enum:
075d7359
SC
1049 case lang_assignment_statement_enum:
1050 case lang_padding_statement_enum:
f9d3d71a
ILT
1051 case lang_input_statement_enum:
1052 if (output_section_statement != NULL
1053 && output_section_statement->bfd_section == NULL)
1054 init_os (output_section_statement);
075d7359
SC
1055 break;
1056 case lang_afile_asection_pair_statement_enum:
1057 FAIL ();
1058 break;
1059 case lang_address_statement_enum:
1060 /* Mark the specified section with the supplied address */
1061 {
1062 lang_output_section_statement_type *os =
ef01a8a8
ILT
1063 lang_output_section_statement_lookup
1064 (s->address_statement.section_name);
075d7359 1065
ef01a8a8
ILT
1066 if (os->bfd_section == NULL)
1067 init_os (os);
075d7359 1068 os->addr_tree = s->address_statement.address;
48491e2e 1069 }
075d7359 1070 break;
2fa0b342 1071 }
2fa0b342
DHW
1072 }
1073}
1074
075d7359 1075static void
8ddef552
DM
1076print_output_section_statement (output_section_statement)
1077 lang_output_section_statement_type * output_section_statement;
2fa0b342
DHW
1078{
1079 asection *section = output_section_statement->bfd_section;
075d7359
SC
1080
1081 print_nl ();
1082 print_section (output_section_statement->name);
1083
e20873a7 1084
075d7359 1085 if (section)
e20873a7
JG
1086 {
1087 print_dot = section->vma;
1088 print_space ();
1089 print_section ("");
1090 print_space ();
1091 print_address (section->vma);
1092 print_space ();
1093 print_size (section->_raw_size);
1094 print_space();
1095 print_size(section->_cooked_size);
1096 print_space ();
1097 print_alignment (section->alignment_power);
1098 print_space ();
2fa0b342 1099#if 0
e20873a7
JG
1100 fprintf (config.map_file, "%s flags", output_section_statement->region->name);
1101 print_flags (stdout, &output_section_statement->flags);
2fa0b342 1102#endif
e20873a7
JG
1103 if (section->flags & SEC_LOAD)
1104 fprintf (config.map_file, "load ");
1105 if (section->flags & SEC_ALLOC)
1106 fprintf (config.map_file, "alloc ");
1107 if (section->flags & SEC_RELOC)
1108 fprintf (config.map_file, "reloc ");
1109 if (section->flags & SEC_HAS_CONTENTS)
1110 fprintf (config.map_file, "contents ");
2fa0b342 1111
e20873a7 1112 }
075d7359 1113 else
e20873a7 1114 {
269773c1 1115 fprintf (config.map_file, " (no attached output section)");
e20873a7
JG
1116 }
1117 print_nl ();
9fce28ed
SC
1118 if (output_section_statement->load_base)
1119 {
1120 int b = exp_get_value_int(output_section_statement->load_base,
1121 0, "output base", lang_final_phase_enum);
1122 printf("Output address %08x\n", b);
1123 }
e20873a7
JG
1124 if (output_section_statement->section_alignment >= 0
1125 || output_section_statement->section_alignment >= 0)
1126 {
1127 printf("\t\t\t\t\tforced alignment ");
1128 if ( output_section_statement->section_alignment >= 0)
075d7359 1129 {
e20873a7 1130 printf("section 2**%d ",output_section_statement->section_alignment );
075d7359 1131 }
e20873a7
JG
1132 if ( output_section_statement->subsection_alignment >= 0)
1133 {
1134 printf("subsection 2**%d ",output_section_statement->subsection_alignment );
1135 }
1136
1137 print_nl ();
1138 }
075d7359
SC
1139 print_statement (output_section_statement->children.head,
1140 output_section_statement);
2fa0b342
DHW
1141
1142}
1143
075d7359 1144static void
8ddef552
DM
1145print_assignment (assignment, output_section)
1146 lang_assignment_statement_type * assignment;
1147 lang_output_section_statement_type * output_section;
2fa0b342
DHW
1148{
1149 etree_value_type result;
075d7359
SC
1150
1151 print_section ("");
1152 print_space ();
1153 print_section ("");
1154 print_space ();
1155 print_address (print_dot);
1156 print_space ();
1157 result = exp_fold_tree (assignment->exp->assign.src,
1158 output_section,
1159 lang_final_phase_enum,
1160 print_dot,
1161 &print_dot);
1162
1163 if (result.valid)
1164 {
1165 print_address (result.value);
1166 }
1167 else
1168 {
1169 fprintf (config.map_file, "*undefined*");
1170 }
1171 print_space ();
1172 exp_print_tree (assignment->exp);
1173
1174 fprintf (config.map_file, "\n");
2fa0b342
DHW
1175}
1176
1177static void
8ddef552
DM
1178print_input_statement (statm)
1179 lang_input_statement_type * statm;
2fa0b342 1180{
075d7359
SC
1181 if (statm->filename != (char *) NULL)
1182 {
1183 fprintf (config.map_file, "LOAD %s\n", statm->filename);
1184 }
2fa0b342
DHW
1185}
1186
804c8601
SC
1187/* Print all the defined symbols for the abfd provided by in the supplied
1188 section.
1189*/
1190
1191static boolean
1192print_one_symbol (hash_entry, ptr)
1193struct bfd_link_hash_entry *hash_entry;
1194PTR ptr;
2fa0b342 1195{
804c8601
SC
1196 asection * sec = (asection *)ptr;
1197
1198 if (hash_entry->type == bfd_link_hash_defined)
1199 {
1200 if (sec == hash_entry->u.def.section) {
1201 print_section ("");
1202 fprintf (config.map_file, " ");
1203 print_section ("");
1204 fprintf (config.map_file, " ");
1205 print_address (hash_entry->u.def.value + outside_section_address (sec));
1206 fprintf (config.map_file, " %s", hash_entry->root.string);
1207 print_nl ();
1208 }
1209 }
09a5aa5e
KR
1210
1211 return true;
2fa0b342 1212}
1418c83b 1213
075d7359 1214static void
8ddef552
DM
1215print_input_section (in)
1216 lang_input_section_type * in;
2fa0b342
DHW
1217{
1218 asection *i = in->section;
f078dc7c 1219 bfd_size_type size = i->_cooked_size != 0 ? i->_cooked_size : i->_raw_size;
1418c83b 1220
075d7359
SC
1221 if (size != 0)
1222 {
1223 print_section ("");
1224 fprintf (config.map_file, " ");
1225 print_section (i->name);
1226 fprintf (config.map_file, " ");
1227 if (i->output_section)
1228 {
1229 print_address (i->output_section->vma + i->output_offset);
1230 fprintf (config.map_file, " ");
ae475b39
SC
1231 print_size (i->_raw_size);
1232 fprintf (config.map_file, " ");
1233 print_size(i->_cooked_size);
075d7359
SC
1234 fprintf (config.map_file, " ");
1235 print_alignment (i->alignment_power);
1236 fprintf (config.map_file, " ");
1237 if (in->ifile)
1238 {
2fa0b342 1239
075d7359 1240 bfd *abfd = in->ifile->the_bfd;
2fa0b342 1241
075d7359
SC
1242 if (in->ifile->just_syms_flag == true)
1243 {
1244 fprintf (config.map_file, "symbols only ");
1245 }
2fa0b342 1246
075d7359
SC
1247 fprintf (config.map_file, " %s ", abfd->xvec->name);
1248 if (abfd->my_archive != (bfd *) NULL)
1249 {
1250 fprintf (config.map_file, "[%s]%s", abfd->my_archive->filename,
1251 abfd->filename);
1252 }
1253 else
1254 {
1255 fprintf (config.map_file, "%s", abfd->filename);
1256 }
1257 fprintf (config.map_file, "(overhead %d bytes)", (int) bfd_alloc_size (abfd));
1258 print_nl ();
2fa0b342 1259
804c8601
SC
1260 /* Print all the symbols */
1261 bfd_link_hash_traverse (link_info.hash, print_one_symbol, (PTR) i);
075d7359
SC
1262 }
1263 else
1264 {
1265 print_nl ();
1266 }
1267
1268
1269 print_dot = outside_section_address (i) + size;
1270 }
1271 else
1272 {
1273 fprintf (config.map_file, "No output section allocated\n");
1274 }
1275 }
1276}
2fa0b342
DHW
1277
1278static void
8ddef552
DM
1279print_fill_statement (fill)
1280 lang_fill_statement_type * fill;
075d7359
SC
1281{
1282 fprintf (config.map_file, "FILL mask ");
1283 print_fill (fill->fill);
1284}
1285
1286static void
8ddef552
DM
1287print_data_statement (data)
1288 lang_data_statement_type * data;
2fa0b342
DHW
1289{
1290/* bfd_vma value; */
075d7359
SC
1291 print_section ("");
1292 print_space ();
1293 print_section ("");
1294 print_space ();
65c552e3 1295/* ASSERT(print_dot == data->output_vma);*/
2fa0b342 1296
075d7359
SC
1297 print_address (data->output_vma + data->output_section->vma);
1298 print_space ();
1299 print_address (data->value);
1300 print_space ();
1301 switch (data->type)
1302 {
1303 case BYTE:
1304 fprintf (config.map_file, "BYTE ");
1305 print_dot += BYTE_SIZE;
1306 break;
1307 case SHORT:
1308 fprintf (config.map_file, "SHORT ");
1309 print_dot += SHORT_SIZE;
1310 break;
1311 case LONG:
1312 fprintf (config.map_file, "LONG ");
1313 print_dot += LONG_SIZE;
1314 break;
c477527c
ILT
1315 case QUAD:
1316 fprintf (config.map_file, "QUAD ");
1317 print_dot += QUAD_SIZE;
1318 break;
075d7359
SC
1319 }
1320
1321 exp_print_tree (data->exp);
2fa0b342 1322
075d7359 1323 fprintf (config.map_file, "\n");
2fa0b342
DHW
1324}
1325
4fdbafb2
ILT
1326/* Print a reloc statement. */
1327
1328static void
1329print_reloc_statement (reloc)
1330 lang_reloc_statement_type *reloc;
1331{
1332 print_section ("");
1333 print_space ();
1334 print_section ("");
1335 print_space ();
1336
1337/* ASSERT(print_dot == data->output_vma);*/
1338
1339 print_address (reloc->output_vma + reloc->output_section->vma);
1340 print_space ();
1341 print_address (reloc->addend_value);
1342 print_space ();
1343
1344 fprintf (config.map_file, "RELOC %s ", reloc->howto->name);
1345
1346 print_dot += bfd_get_reloc_size (reloc->howto);
1347
1348 exp_print_tree (reloc->addend_exp);
1349
1350 fprintf (config.map_file, "\n");
1351}
2fa0b342
DHW
1352
1353static void
8ddef552
DM
1354print_padding_statement (s)
1355 lang_padding_statement_type * s;
075d7359
SC
1356{
1357 print_section ("");
1358 print_space ();
1359 print_section ("*fill*");
1360 print_space ();
1361 print_address (s->output_offset + s->output_section->vma);
1362 print_space ();
1363 print_size (s->size);
1364 print_space ();
1365 print_fill (s->fill);
1366 print_nl ();
ffc50032 1367
aa34a7c3 1368 print_dot = s->output_offset + s->output_section->vma + s->size;
ffc50032 1369
2fa0b342
DHW
1370}
1371
075d7359 1372static void
8ddef552
DM
1373print_wild_statement (w, os)
1374 lang_wild_statement_type * w;
1375 lang_output_section_statement_type * os;
2fa0b342 1376{
075d7359
SC
1377 fprintf (config.map_file, " from ");
1378 if (w->filename != (char *) NULL)
1379 {
1380 fprintf (config.map_file, "%s", w->filename);
1381 }
1382 else
1383 {
1384 fprintf (config.map_file, "*");
1385 }
1386 if (w->section_name != (char *) NULL)
1387 {
1388 fprintf (config.map_file, "(%s)", w->section_name);
1389 }
1390 else
1391 {
1392 fprintf (config.map_file, "(*)");
1393 }
1394 print_nl ();
1395 print_statement (w->children.head, os);
2fa0b342
DHW
1396
1397}
1398static void
8ddef552
DM
1399print_statement (s, os)
1400 lang_statement_union_type * s;
1401 lang_output_section_statement_type * os;
2fa0b342 1402{
075d7359 1403 while (s)
c611e285 1404 {
075d7359 1405 switch (s->header.type)
c611e285 1406 {
075d7359
SC
1407 case lang_constructors_statement_enum:
1408 fprintf (config.map_file, "constructors:\n");
1409 print_statement (constructor_list.head, os);
1410 break;
1411 case lang_wild_statement_enum:
1412 print_wild_statement (&s->wild_statement, os);
1413 break;
1414 default:
1415 fprintf (config.map_file, "Fail with %d\n", s->header.type);
1416 FAIL ();
1417 break;
1418 case lang_address_statement_enum:
1419 fprintf (config.map_file, "address\n");
1420 break;
1421 case lang_object_symbols_statement_enum:
1422 fprintf (config.map_file, "object symbols\n");
1423 break;
1424 case lang_fill_statement_enum:
1425 print_fill_statement (&s->fill_statement);
1426 break;
1427 case lang_data_statement_enum:
1428 print_data_statement (&s->data_statement);
1429 break;
4fdbafb2
ILT
1430 case lang_reloc_statement_enum:
1431 print_reloc_statement (&s->reloc_statement);
1432 break;
075d7359
SC
1433 case lang_input_section_enum:
1434 print_input_section (&s->input_section);
1435 break;
1436 case lang_padding_statement_enum:
1437 print_padding_statement (&s->padding_statement);
1438 break;
1439 case lang_output_section_statement_enum:
1440 print_output_section_statement (&s->output_section_statement);
1441 break;
1442 case lang_assignment_statement_enum:
1443 print_assignment (&s->assignment_statement,
1444 os);
1445 break;
1446 case lang_target_statement_enum:
1447 fprintf (config.map_file, "TARGET(%s)\n", s->target_statement.target);
1448 break;
1449 case lang_output_statement_enum:
1450 fprintf (config.map_file, "OUTPUT(%s %s)\n",
c611e285 1451 s->output_statement.name,
e20873a7 1452 output_target ? output_target : "");
075d7359
SC
1453 break;
1454 case lang_input_statement_enum:
1455 print_input_statement (&s->input_statement);
1456 break;
1457 case lang_afile_asection_pair_statement_enum:
1458 FAIL ();
1459 break;
c611e285 1460 }
075d7359 1461 s = s->next;
2fa0b342 1462 }
2fa0b342
DHW
1463}
1464
1465
1466static void
8ddef552 1467print_statements ()
2fa0b342 1468{
075d7359
SC
1469 print_statement (statement_list.head,
1470 abs_output_section);
1471
2fa0b342
DHW
1472}
1473
1474static bfd_vma
9f629407
ILT
1475insert_pad (this_ptr, fill, power, output_section_statement, dot)
1476 lang_statement_union_type ** this_ptr;
1477 fill_type fill;
1478 unsigned int power;
1479 asection * output_section_statement;
1480 bfd_vma dot;
075d7359
SC
1481{
1482 /* Align this section first to the
2fa0b342
DHW
1483 input sections requirement, then
1484 to the output section's requirement.
075d7359 1485 If this alignment is > than any seen before,
2fa0b342
DHW
1486 then record it too. Perform the alignment by
1487 inserting a magic 'padding' statement.
1488 */
1489
075d7359 1490 unsigned int alignment_needed = align_power (dot, power) - dot;
2fa0b342 1491
075d7359 1492 if (alignment_needed != 0)
2fa0b342 1493 {
075d7359
SC
1494 lang_statement_union_type *new =
1495 (lang_statement_union_type *)
1496 stat_alloc ((bfd_size_type) (sizeof (lang_padding_statement_type)));
1497
2fa0b342
DHW
1498 /* Link into existing chain */
1499 new->header.next = *this_ptr;
1500 *this_ptr = new;
1501 new->header.type = lang_padding_statement_enum;
1502 new->padding_statement.output_section = output_section_statement;
1503 new->padding_statement.output_offset =
1504 dot - output_section_statement->vma;
1505 new->padding_statement.fill = fill;
1506 new->padding_statement.size = alignment_needed;
1507 }
1508
1509
1510 /* Remember the most restrictive alignment */
075d7359
SC
1511 if (power > output_section_statement->alignment_power)
1512 {
1513 output_section_statement->alignment_power = power;
1514 }
c611e285 1515 output_section_statement->_raw_size += alignment_needed;
2fa0b342
DHW
1516 return alignment_needed + dot;
1517
1518}
1519
1418c83b 1520/* Work out how much this section will move the dot point */
075d7359 1521static bfd_vma
9f629407
ILT
1522size_input_section (this_ptr, output_section_statement, fill, dot, relax)
1523 lang_statement_union_type ** this_ptr;
1524 lang_output_section_statement_type * output_section_statement;
c477527c 1525 fill_type fill;
9f629407
ILT
1526 bfd_vma dot;
1527 boolean relax;
2fa0b342
DHW
1528{
1529 lang_input_section_type *is = &((*this_ptr)->input_section);
1530 asection *i = is->section;
2fa0b342 1531
075d7359
SC
1532 if (is->ifile->just_syms_flag == false)
1533 {
e20873a7
JG
1534 if (output_section_statement->subsection_alignment != -1)
1535 i->alignment_power =
1536 output_section_statement->subsection_alignment;
1537
075d7359
SC
1538 dot = insert_pad (this_ptr, fill, i->alignment_power,
1539 output_section_statement->bfd_section, dot);
1540
075d7359 1541 /* Remember where in the output section this input section goes */
ac004870 1542
075d7359
SC
1543 i->output_offset = dot - output_section_statement->bfd_section->vma;
1544
ae475b39
SC
1545 /* Mark how big the output section must be to contain this now
1546 */
f078dc7c
ILT
1547 if (i->_cooked_size != 0)
1548 dot += i->_cooked_size;
ae475b39 1549 else
f078dc7c 1550 dot += i->_raw_size;
ae475b39 1551 output_section_statement->bfd_section->_raw_size = dot - output_section_statement->bfd_section->vma;
075d7359 1552 }
ac004870 1553 else
075d7359
SC
1554 {
1555 i->output_offset = i->vma - output_section_statement->bfd_section->vma;
1556 }
2fa0b342 1557
075d7359 1558 return dot;
2fa0b342
DHW
1559}
1560
193c5f93
ILT
1561/* This variable indicates whether bfd_relax_section should be called
1562 again. */
1563
1564static boolean relax_again;
1565
1566/* Set the sizes for all the output sections. */
c611e285 1567
a62494c4 1568bfd_vma
9f629407
ILT
1569lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
1570 lang_statement_union_type * s;
1571 lang_output_section_statement_type * output_section_statement;
1572 lang_statement_union_type ** prev;
c477527c 1573 fill_type fill;
9f629407
ILT
1574 bfd_vma dot;
1575 boolean relax;
c611e285
SC
1576{
1577 /* Size up the sections from their constituent parts */
075d7359 1578 for (; s != (lang_statement_union_type *) NULL; s = s->next)
ae475b39
SC
1579 {
1580 switch (s->header.type)
075d7359 1581 {
c611e285 1582
ae475b39
SC
1583 case lang_output_section_statement_enum:
1584 {
1585 bfd_vma after;
1586 lang_output_section_statement_type *os = &s->output_section_statement;
1587
f9d3d71a
ILT
1588 if (os->bfd_section == NULL)
1589 {
1590 /* This section was never actually created. */
1591 break;
1592 }
1593
27f7237e
ILT
1594 /* If this is a COFF shared library section, use the size and
1595 address from the input section. FIXME: This is COFF
1596 specific; it would be cleaner if there were some other way
1597 to do this, but nothing simple comes to mind. */
1598 if ((os->bfd_section->flags & SEC_COFF_SHARED_LIBRARY) != 0)
1599 {
1600 asection *input;
1601
1602 if (os->children.head == NULL
1603 || os->children.head->next != NULL
1604 || os->children.head->header.type != lang_input_section_enum)
1605 einfo ("%P%X: Internal error on COFF shared library section %s",
1606 os->name);
1607
1608 input = os->children.head->input_section.section;
1609 bfd_set_section_vma (os->bfd_section->owner,
1610 os->bfd_section,
1611 bfd_section_vma (input->owner, input));
1612 os->bfd_section->_raw_size = input->_raw_size;
1613 break;
1614 }
e9b63852 1615
ae475b39
SC
1616 if (os->bfd_section == &bfd_abs_section)
1617 {
1618 /* No matter what happens, an abs section starts at zero */
1619 bfd_set_section_vma (0, os->bfd_section, 0);
1620 }
1621 else
1622 {
1623 if (os->addr_tree == (etree_type *) NULL)
1624 {
1625 /* No address specified for this section, get one
1626 from the region specification
1627 */
1628 if (os->region == (lang_memory_region_type *) NULL)
1629 {
1630 os->region = lang_memory_region_lookup ("*default*");
1631 }
1632 dot = os->region->current;
feaa9c4b
ILT
1633 if (os->section_alignment == -1)
1634 dot = align_power (dot, os->bfd_section->alignment_power);
ae475b39
SC
1635 }
1636 else
1637 {
1638 etree_value_type r;
1639
1640 r = exp_fold_tree (os->addr_tree,
1641 abs_output_section,
1642 lang_allocating_phase_enum,
1643 dot, &dot);
1644 if (r.valid == false)
1645 {
1646 einfo ("%F%S: non constant address expression for section %s\n",
1647 os->name);
1648 }
1649 dot = r.value;
1650 }
1651 /* The section starts here */
1652 /* First, align to what the section needs */
1653
a62494c4
JL
1654 if (os->section_alignment != -1)
1655 dot = align_power (dot, os->section_alignment);
ae475b39 1656
ae475b39 1657 bfd_set_section_vma (0, os->bfd_section, dot);
9fce28ed
SC
1658
1659 if (os->load_base) {
1660 os->bfd_section->lma
1661 = exp_get_value_int(os->load_base, 0,"load base", lang_final_phase_enum);
1662 }
ae475b39
SC
1663 }
1664
1665
1666 os->bfd_section->output_offset = 0;
1667
1668 (void) lang_size_sections (os->children.head, os, &os->children.head,
1669 os->fill, dot, relax);
1670 /* Ignore the size of the input sections, use the vma and size to */
1671 /* align against */
1672
8ddef552 1673 after = ALIGN_N (os->bfd_section->vma +
97fbbaca
JL
1674 os->bfd_section->_raw_size,
1675 /* The coercion here is important, see ld.h. */
1676 (bfd_vma) os->block_value);
ae475b39
SC
1677
1678 os->bfd_section->_raw_size = after - os->bfd_section->vma;
1679 dot = os->bfd_section->vma + os->bfd_section->_raw_size;
1680 os->processed = true;
1681
1682 /* Replace into region ? */
1683 if (os->addr_tree == (etree_type *) NULL
1684 && os->region != (lang_memory_region_type *) NULL)
1685 {
1686 os->region->current = dot;
1687 /* Make sure this isn't silly */
9fce28ed
SC
1688 if (( os->region->current
1689 > os->region->origin + os->region->length)
1690 || ( os->region->origin > os->region->current ))
1691 {
ddddcdf0 1692 einfo ("%X%P: region %s is full (%B section %s)\n",
9fce28ed
SC
1693 os->region->name,
1694 os->bfd_section->owner,
1695 os->bfd_section->name);
1696 /* Reset the region pointer */
1697 os->region->current = 0;
ae475b39 1698
9fce28ed 1699 }
ae475b39
SC
1700
1701 }
1702 }
9d1fe8a4 1703
ae475b39
SC
1704 break;
1705 case lang_constructors_statement_enum:
1706 dot = lang_size_sections (constructor_list.head,
1707 output_section_statement,
1708 &s->wild_statement.children.head,
1709 fill,
1710 dot, relax);
1711 break;
9d1fe8a4 1712
ae475b39
SC
1713 case lang_data_statement_enum:
1714 {
1715 unsigned int size = 0;
1716
1717 s->data_statement.output_vma = dot - output_section_statement->bfd_section->vma;
1718 s->data_statement.output_section =
1719 output_section_statement->bfd_section;
1720
1721 switch (s->data_statement.type)
1722 {
c477527c
ILT
1723 case QUAD:
1724 size = QUAD_SIZE;
1725 break;
ae475b39
SC
1726 case LONG:
1727 size = LONG_SIZE;
1728 break;
1729 case SHORT:
1730 size = SHORT_SIZE;
1731 break;
1732 case BYTE:
1733 size = BYTE_SIZE;
1734 break;
1735
1736 }
1737 dot += size;
1738 output_section_statement->bfd_section->_raw_size += size;
1739 }
1740 break;
c611e285 1741
4fdbafb2
ILT
1742 case lang_reloc_statement_enum:
1743 {
1744 int size;
1745
1746 s->reloc_statement.output_vma =
1747 dot - output_section_statement->bfd_section->vma;
1748 s->reloc_statement.output_section =
1749 output_section_statement->bfd_section;
1750 size = bfd_get_reloc_size (s->reloc_statement.howto);
1751 dot += size;
1752 output_section_statement->bfd_section->_raw_size += size;
1753 }
1754 break;
1755
ae475b39 1756 case lang_wild_statement_enum:
c611e285 1757
ae475b39
SC
1758 dot = lang_size_sections (s->wild_statement.children.head,
1759 output_section_statement,
1760 &s->wild_statement.children.head,
c611e285 1761
ae475b39 1762 fill, dot, relax);
c611e285 1763
ae475b39 1764 break;
c611e285 1765
ae475b39 1766 case lang_object_symbols_statement_enum:
c477527c
ILT
1767 link_info.create_object_symbols_section =
1768 output_section_statement->bfd_section;
ae475b39
SC
1769 break;
1770 case lang_output_statement_enum:
1771 case lang_target_statement_enum:
1772 break;
1773 case lang_input_section_enum:
ae475b39 1774 {
c477527c
ILT
1775 asection *i;
1776
193c5f93
ILT
1777 i = (*prev)->input_section.section;
1778 if (! relax)
1779 i->_cooked_size = i->_raw_size;
1780 else
755f42fe 1781 {
193c5f93 1782 boolean again;
075d7359 1783
193c5f93
ILT
1784 if (! bfd_relax_section (i->owner, i, &link_info, &again))
1785 einfo ("%P%F: can't relax section: %E\n");
1786 if (again)
1787 relax_again = true;
1788 }
1789 dot = size_input_section (prev,
1790 output_section_statement,
1791 output_section_statement->fill,
1792 dot, relax);
ae475b39 1793 }
ae475b39
SC
1794 break;
1795 case lang_input_statement_enum:
1796 break;
1797 case lang_fill_statement_enum:
1798 s->fill_statement.output_section = output_section_statement->bfd_section;
075d7359 1799
ae475b39
SC
1800 fill = s->fill_statement.fill;
1801 break;
1802 case lang_assignment_statement_enum:
1803 {
1804 bfd_vma newdot = dot;
1805
1806 exp_fold_tree (s->assignment_statement.exp,
1807 output_section_statement,
1808 lang_allocating_phase_enum,
1809 dot,
1810 &newdot);
1811
1812 if (newdot != dot && !relax)
27f7237e
ILT
1813 {
1814 /* The assignment changed dot. Insert a pad. */
1815 if (output_section_statement == abs_output_section)
1816 {
1817 /* If we don't have an output section, then just adjust
1818 the default memory address. */
1819 lang_memory_region_lookup ("*default*")->current = newdot;
1820 }
1821 else
1822 {
1823 lang_statement_union_type *new =
1824 ((lang_statement_union_type *)
1825 stat_alloc (sizeof (lang_padding_statement_type)));
1826
1827 /* Link into existing chain */
1828 new->header.next = *prev;
1829 *prev = new;
1830 new->header.type = lang_padding_statement_enum;
1831 new->padding_statement.output_section =
1832 output_section_statement->bfd_section;
1833 new->padding_statement.output_offset =
1834 dot - output_section_statement->bfd_section->vma;
1835 new->padding_statement.fill = fill;
1836 new->padding_statement.size = newdot - dot;
1837 output_section_statement->bfd_section->_raw_size +=
1838 new->padding_statement.size;
1839 }
1840
1841 dot = newdot;
1842 }
ae475b39 1843 }
27f7237e 1844 break;
9d87af56
ILT
1845
1846 case lang_padding_statement_enum:
1847 /* If we are relaxing, and this is not the first pass, some
1848 padding statements may have been inserted during previous
1849 passes. We may have to move the padding statement to a new
1850 location if dot has a different value at this point in this
1851 pass than it did at this point in the previous pass. */
1852 s->padding_statement.output_offset =
1853 dot - output_section_statement->bfd_section->vma;
1854 dot += s->padding_statement.size;
1855 break;
1856
ae475b39
SC
1857 default:
1858 FAIL ();
1859 break;
9d87af56 1860
ae475b39 1861 /* This can only get here when relaxing is turned on */
075d7359 1862
ae475b39
SC
1863 case lang_address_statement_enum:
1864 break;
075d7359 1865 }
ae475b39
SC
1866 prev = &s->header.next;
1867 }
c611e285
SC
1868 return dot;
1869}
9d1fe8a4 1870
2fa0b342 1871static bfd_vma
9f629407
ILT
1872lang_do_assignments (s, output_section_statement, fill, dot)
1873 lang_statement_union_type * s;
1874 lang_output_section_statement_type * output_section_statement;
c477527c 1875 fill_type fill;
9f629407 1876 bfd_vma dot;
2fa0b342 1877{
075d7359 1878 for (; s != (lang_statement_union_type *) NULL; s = s->next)
2fa0b342 1879 {
075d7359 1880 switch (s->header.type)
2fa0b342 1881 {
075d7359
SC
1882 case lang_constructors_statement_enum:
1883 dot = lang_do_assignments (constructor_list.head,
1884 output_section_statement,
1885 fill,
1886 dot);
1887 break;
1888
1889 case lang_output_section_statement_enum:
1890 {
1891 lang_output_section_statement_type *os =
269773c1 1892 &(s->output_section_statement);
2fa0b342 1893
269773c1
ILT
1894 if (os->bfd_section != NULL)
1895 {
1896 dot = os->bfd_section->vma;
1897 (void) lang_do_assignments (os->children.head, os,
1898 os->fill, dot);
1899 dot = os->bfd_section->vma + os->bfd_section->_raw_size;
1900 }
075d7359
SC
1901 }
1902 break;
1903 case lang_wild_statement_enum:
2fa0b342 1904
075d7359
SC
1905 dot = lang_do_assignments (s->wild_statement.children.head,
1906 output_section_statement,
1907 fill, dot);
2fa0b342 1908
075d7359
SC
1909 break;
1910
1911 case lang_object_symbols_statement_enum:
1912 case lang_output_statement_enum:
1913 case lang_target_statement_enum:
1418c83b 1914#if 0
075d7359 1915 case lang_common_statement_enum:
1418c83b 1916#endif
2fa0b342 1917 break;
075d7359
SC
1918 case lang_data_statement_enum:
1919 {
1920 etree_value_type value;
1921
1922 value = exp_fold_tree (s->data_statement.exp,
1923 abs_output_section,
1924 lang_final_phase_enum, dot, &dot);
1925 s->data_statement.value = value.value;
1926 if (value.valid == false)
ddddcdf0 1927 einfo ("%F%P: invalid data statement\n");
075d7359
SC
1928 }
1929 switch (s->data_statement.type)
1930 {
c477527c
ILT
1931 case QUAD:
1932 dot += QUAD_SIZE;
1933 break;
075d7359
SC
1934 case LONG:
1935 dot += LONG_SIZE;
1936 break;
1937 case SHORT:
1938 dot += SHORT_SIZE;
1939 break;
1940 case BYTE:
1941 dot += BYTE_SIZE;
1942 break;
1943 }
2fa0b342 1944 break;
4fdbafb2
ILT
1945
1946 case lang_reloc_statement_enum:
1947 {
1948 etree_value_type value;
1949
1950 value = exp_fold_tree (s->reloc_statement.addend_exp,
1951 abs_output_section,
1952 lang_final_phase_enum, dot, &dot);
1953 s->reloc_statement.addend_value = value.value;
1954 if (value.valid == false)
1955 einfo ("%F%P: invalid reloc statement\n");
1956 }
1957 dot += bfd_get_reloc_size (s->reloc_statement.howto);
1958 break;
1959
075d7359
SC
1960 case lang_input_section_enum:
1961 {
1962 asection *in = s->input_section.section;
1963
f078dc7c
ILT
1964 if (in->_cooked_size != 0)
1965 dot += in->_cooked_size;
1966 else
1967 dot += in->_raw_size;
075d7359 1968 }
2fa0b342 1969 break;
2fa0b342 1970
075d7359
SC
1971 case lang_input_statement_enum:
1972 break;
1973 case lang_fill_statement_enum:
1974 fill = s->fill_statement.fill;
1975 break;
1976 case lang_assignment_statement_enum:
1977 {
1978 exp_fold_tree (s->assignment_statement.exp,
1979 output_section_statement,
1980 lang_final_phase_enum,
1981 dot,
1982 &dot);
1983 }
1984
1985 break;
1986 case lang_padding_statement_enum:
1987 dot += s->padding_statement.size;
1988 break;
1989 default:
1990 FAIL ();
1991 break;
1992 case lang_address_statement_enum:
1993 break;
1994 }
2fa0b342
DHW
1995
1996 }
1997 return dot;
1998}
1999
2fa0b342 2000static void
8ddef552 2001lang_finish ()
2fa0b342 2002{
c477527c
ILT
2003 struct bfd_link_hash_entry *h;
2004 boolean warn = link_info.relocateable ? false : true;
075d7359 2005
c477527c
ILT
2006 if (entry_symbol == (char *) NULL)
2007 {
2008 /* No entry has been specified. Look for start, but don't warn
2009 if we don't find it. */
2010 entry_symbol = "start";
2011 warn = false;
2012 }
2fa0b342 2013
c477527c
ILT
2014 h = bfd_link_hash_lookup (link_info.hash, entry_symbol, false, false, true);
2015 if (h != (struct bfd_link_hash_entry *) NULL
2016 && h->type == bfd_link_hash_defined)
075d7359 2017 {
c477527c 2018 bfd_vma val;
075d7359 2019
c477527c
ILT
2020 val = (h->u.def.value
2021 + bfd_get_section_vma (output_bfd,
2022 h->u.def.section->output_section)
2023 + h->u.def.section->output_offset);
2024 if (! bfd_set_start_address (output_bfd, val))
2025 einfo ("%P%F:%s: can't set start address\n", entry_symbol);
075d7359 2026 }
c477527c 2027 else
22a78f0d 2028 {
c477527c
ILT
2029 asection *ts;
2030
2031 /* Can't find the entry symbol. Use the first address in the
2032 text section. */
2033 ts = bfd_get_section_by_name (output_bfd, ".text");
2034 if (ts != (asection *) NULL)
2035 {
2036 if (warn)
2037 einfo ("%P: warning: cannot find entry symbol %s; defaulting to %V\n",
2038 entry_symbol, bfd_get_section_vma (output_bfd, ts));
2039 if (! bfd_set_start_address (output_bfd,
2040 bfd_get_section_vma (output_bfd, ts)))
2041 einfo ("%P%F: can't set start address\n");
2042 }
2043 else
2044 {
2045 if (warn)
2046 einfo ("%P: warning: cannot find entry symbol %s; not setting start address\n",
2047 entry_symbol);
2048 }
22a78f0d 2049 }
2fa0b342
DHW
2050}
2051
2052/* By now we know the target architecture, and we may have an */
2053/* ldfile_output_machine_name */
2054static void
8ddef552 2055lang_check ()
2fa0b342
DHW
2056{
2057 lang_statement_union_type *file;
075d7359
SC
2058 bfd *input_bfd;
2059 unsigned long input_machine;
2060 enum bfd_architecture input_architecture;
2061 CONST bfd_arch_info_type *compatible;
7bc4a0d7 2062
2fa0b342 2063 for (file = file_chain.head;
075d7359
SC
2064 file != (lang_statement_union_type *) NULL;
2065 file = file->input_statement.next)
2066 {
075d7359 2067 input_bfd = file->input_statement.the_bfd;
7bc4a0d7 2068
075d7359
SC
2069 input_machine = bfd_get_mach (input_bfd);
2070 input_architecture = bfd_get_arch (input_bfd);
7bc4a0d7 2071
7bc4a0d7 2072
075d7359
SC
2073 /* Inspect the architecture and ensure we're linking like with
2074 like */
7bc4a0d7 2075
075d7359
SC
2076 compatible = bfd_arch_get_compatible (input_bfd,
2077 output_bfd);
22a78f0d 2078
075d7359
SC
2079 if (compatible)
2080 {
2081 ldfile_output_machine = compatible->mach;
2082 ldfile_output_architecture = compatible->arch;
2083 }
2084 else
2085 {
7bc4a0d7 2086
c477527c 2087 einfo ("%P: warning: %s architecture of input file `%B' is incompatible with %s output\n",
075d7359
SC
2088 bfd_printable_name (input_bfd), input_bfd,
2089 bfd_printable_name (output_bfd));
7bc4a0d7 2090
ddddcdf0
ILT
2091 if (! bfd_set_arch_mach (output_bfd,
2092 input_architecture,
2093 input_machine))
2094 einfo ("%P%F:%s: can't set architecture: %E\n",
2095 bfd_get_filename (output_bfd));
075d7359 2096 }
2fa0b342 2097
075d7359
SC
2098 }
2099}
2fa0b342 2100
c477527c
ILT
2101/* Look through all the global common symbols and attach them to the
2102 correct section. The -sort-common command line switch may be used
2103 to roughly sort the entries by size. */
2fa0b342
DHW
2104
2105static void
8ddef552 2106lang_common ()
2fa0b342 2107{
c477527c
ILT
2108 if (link_info.relocateable
2109 && ! command_line.force_common_definition)
2110 return;
075d7359 2111
c477527c
ILT
2112 if (! config.sort_common)
2113 bfd_link_hash_traverse (link_info.hash, lang_one_common, (PTR) NULL);
2114 else
075d7359 2115 {
c477527c 2116 unsigned int power;
1418c83b 2117
c477527c
ILT
2118 for (power = 1; power <= 16; power <<= 1)
2119 bfd_link_hash_traverse (link_info.hash, lang_one_common,
2120 (PTR) &power);
2121 }
2122}
29f33467 2123
c477527c 2124/* Place one common symbol in the correct section. */
075d7359 2125
c477527c
ILT
2126static boolean
2127lang_one_common (h, info)
2128 struct bfd_link_hash_entry *h;
2129 PTR info;
2130{
2131 unsigned int power_of_two;
2132 bfd_vma size;
2133 size_t align;
2134 asection *section;
075d7359 2135
c477527c
ILT
2136 if (h->type != bfd_link_hash_common)
2137 return true;
075d7359 2138
c477527c
ILT
2139 size = h->u.c.size;
2140 switch (size)
2141 {
2142 case 0:
2143 case 1:
2144 power_of_two = 0;
2145 align = 1;
2146 break;
2147 case 2:
2148 power_of_two = 1;
2149 align = 2;
2150 break;
2151 case 3:
2152 case 4:
2153 power_of_two = 2;
2154 align = 4;
2155 break;
2156 case 5:
2157 case 6:
2158 case 7:
2159 case 8:
2160 power_of_two = 3;
2161 align = 8;
2162 break;
2163 default:
2164 power_of_two = 4;
2165 align = 16;
2166 break;
2167 }
2168
2169 if (config.sort_common && align != *(unsigned int *) info)
2170 return true;
075d7359 2171
c477527c 2172 section = h->u.c.section;
075d7359 2173
c477527c
ILT
2174 /* Increase the size of the section. */
2175 section->_raw_size = ALIGN_N (section->_raw_size, align);
075d7359 2176
c477527c
ILT
2177 /* Adjust the alignment if necessary. */
2178 if (power_of_two > section->alignment_power)
2179 section->alignment_power = power_of_two;
075d7359 2180
c477527c
ILT
2181 /* Change the symbol from common to defined. */
2182 h->type = bfd_link_hash_defined;
2183 h->u.def.section = section;
2184 h->u.def.value = section->_raw_size;
097879bc 2185
c477527c
ILT
2186 /* Increase the size of the section. */
2187 section->_raw_size += size;
1418c83b 2188
b495c314 2189 if (config.map_file != NULL)
c477527c
ILT
2190 fprintf (config.map_file, "Allocating common %s: %lx at %lx %s\n",
2191 h->root.string, (unsigned long) size,
2192 (unsigned long) h->u.def.value, section->owner->filename);
1418c83b 2193
c477527c 2194 return true;
2fa0b342
DHW
2195}
2196
2197/*
075d7359 2198run through the input files and ensure that every input
2fa0b342
DHW
2199section has somewhere to go. If one is found without
2200a destination then create an input request and place it
2201into the statement tree.
2202*/
2203
075d7359 2204static void
8ddef552 2205lang_place_orphans ()
2fa0b342
DHW
2206{
2207 lang_input_statement_type *file;
1418c83b 2208
075d7359
SC
2209 for (file = (lang_input_statement_type *) file_chain.head;
2210 file != (lang_input_statement_type *) NULL;
2211 file = (lang_input_statement_type *) file->next)
2212 {
2213 asection *s;
2214
f9d3d71a
ILT
2215 if (file->just_syms_flag)
2216 continue;
2217
075d7359
SC
2218 for (s = file->the_bfd->sections;
2219 s != (asection *) NULL;
2220 s = s->next)
2221 {
2222 if (s->output_section == (asection *) NULL)
2223 {
2224 /* This section of the file is not attatched, root
2225 around for a sensible place for it to go */
2226
2227 if (file->common_section == s)
2228 {
2229 /* This is a lonely common section which must
2230 have come from an archive. We attatch to the
2231 section with the wildcard */
c477527c
ILT
2232 if (! link_info.relocateable
2233 && ! command_line.force_common_definition)
075d7359
SC
2234 {
2235 if (default_common_section ==
2236 (lang_output_section_statement_type *) NULL)
2237 {
a4aeaacf 2238 info_msg ("%P: no [COMMON] command, defaulting to .bss\n");
075d7359
SC
2239
2240 default_common_section =
2241 lang_output_section_statement_lookup (".bss");
2242
2243 }
2244 wild_doit (&default_common_section->children, s,
2245 default_common_section, file);
2246 }
2247 }
2248 else
2249 {
2250 lang_output_section_statement_type *os =
2251 lang_output_section_statement_lookup (s->name);
2fa0b342 2252
075d7359
SC
2253 wild_doit (&os->children, s, os, file);
2254 }
2255 }
2fa0b342 2256 }
2fa0b342 2257 }
2fa0b342
DHW
2258}
2259
2260
2fa0b342 2261void
8ddef552
DM
2262lang_set_flags (ptr, flags)
2263 int *ptr;
2264 CONST char *flags;
2fa0b342 2265{
075d7359
SC
2266 boolean state = false;
2267
2268 *ptr = 0;
2fa0b342 2269 while (*flags)
075d7359
SC
2270 {
2271 if (*flags == '!')
2272 {
2273 state = false;
2274 flags++;
2275 }
2276 else
2277 state = true;
2278 switch (*flags)
2279 {
2280 case 'R':
2281 /* ptr->flag_read = state; */
2282 break;
2283 case 'W':
2284 /* ptr->flag_write = state; */
2285 break;
2286 case 'X':
2287 /* ptr->flag_executable= state;*/
2288 break;
2289 case 'L':
2290 case 'I':
2291 /* ptr->flag_loadable= state;*/
2292 break;
2293 default:
ddddcdf0 2294 einfo ("%P%F: invalid syntax in flags\n");
075d7359
SC
2295 break;
2296 }
dc4726c2
SC
2297 flags++;
2298 }
2fa0b342
DHW
2299}
2300
a4d2a48e
ILT
2301/* Call a function on each input file. This function will be called
2302 on an archive, but not on the elements. */
2303
2304void
2305lang_for_each_input_file (func)
2306 void (*func) PARAMS ((lang_input_statement_type *));
2307{
2308 lang_input_statement_type *f;
2309
2310 for (f = (lang_input_statement_type *) input_file_chain.head;
2311 f != NULL;
2312 f = (lang_input_statement_type *) f->next_real_file)
2313 func (f);
2314}
2fa0b342 2315
a4d2a48e
ILT
2316/* Call a function on each file. The function will be called on all
2317 the elements of an archive which are included in the link, but will
2318 not be called on the archive file itself. */
2fa0b342
DHW
2319
2320void
8ddef552
DM
2321lang_for_each_file (func)
2322 void (*func) PARAMS ((lang_input_statement_type *));
2fa0b342
DHW
2323{
2324 lang_input_statement_type *f;
075d7359
SC
2325
2326 for (f = (lang_input_statement_type *) file_chain.head;
2327 f != (lang_input_statement_type *) NULL;
2328 f = (lang_input_statement_type *) f->next)
2329 {
2330 func (f);
2331 }
2fa0b342
DHW
2332}
2333
9f629407
ILT
2334#if 0
2335
2336/* Not used. */
2fa0b342
DHW
2337
2338void
8ddef552
DM
2339lang_for_each_input_section (func)
2340 void (*func) PARAMS ((bfd * ab, asection * as));
2fa0b342
DHW
2341{
2342 lang_input_statement_type *f;
075d7359
SC
2343
2344 for (f = (lang_input_statement_type *) file_chain.head;
2345 f != (lang_input_statement_type *) NULL;
2346 f = (lang_input_statement_type *) f->next)
2fa0b342
DHW
2347 {
2348 asection *s;
075d7359 2349
2fa0b342 2350 for (s = f->the_bfd->sections;
075d7359
SC
2351 s != (asection *) NULL;
2352 s = s->next)
2353 {
2354 func (f->the_bfd, s);
2355 }
2fa0b342
DHW
2356 }
2357}
2358
9f629407 2359#endif
2fa0b342 2360
075d7359 2361void
8ddef552
DM
2362ldlang_add_file (entry)
2363 lang_input_statement_type * entry;
2fa0b342 2364{
5e6cd559
ILT
2365 bfd **pp;
2366
075d7359
SC
2367 lang_statement_append (&file_chain,
2368 (lang_statement_union_type *) entry,
2369 &entry->next);
c477527c
ILT
2370
2371 /* The BFD linker needs to have a list of all input BFDs involved in
2372 a link. */
2373 ASSERT (entry->the_bfd->link_next == (bfd *) NULL);
2374 ASSERT (entry->the_bfd != output_bfd);
5e6cd559
ILT
2375 for (pp = &link_info.input_bfds;
2376 *pp != (bfd *) NULL;
2377 pp = &(*pp)->link_next)
2378 ;
2379 *pp = entry->the_bfd;
c477527c 2380 entry->the_bfd->usrdata = (PTR) entry;
fc1dfb71 2381 bfd_set_gp_size (entry->the_bfd, g_switch_value);
2fa0b342
DHW
2382}
2383
2fa0b342 2384void
2c6635a4 2385lang_add_output (name, from_script)
8ddef552 2386 CONST char *name;
2c6635a4 2387 int from_script;
2fa0b342 2388{
2c6635a4
ILT
2389 /* Make -o on command line override OUTPUT in script. */
2390 if (had_output_filename == false || !from_script)
2391 {
2392 output_filename = name;
2393 had_output_filename = true;
2394 }
2fa0b342
DHW
2395}
2396
2397
2398static lang_output_section_statement_type *current_section;
2399
e20873a7 2400static int topower(x)
9f629407 2401 int x;
e20873a7
JG
2402{
2403 unsigned int i = 1;
2404 int l;
2405 if (x < 0) return -1;
2406 for (l = 0; l < 32; l++)
2407 {
2408 if (i >= x) return l;
2409 i<<=1;
2410 }
29f33467 2411 return 0;
e20873a7 2412}
2fa0b342 2413void
8ddef552
DM
2414lang_enter_output_section_statement (output_section_statement_name,
2415 address_exp, flags, block_value,
9f629407 2416 align, subalign, ebase)
fcf276c4 2417 const char *output_section_statement_name;
8ddef552
DM
2418 etree_type * address_exp;
2419 int flags;
2420 bfd_vma block_value;
2421 etree_type *align;
2422 etree_type *subalign;
9f629407 2423 etree_type *ebase;
2fa0b342
DHW
2424{
2425 lang_output_section_statement_type *os;
075d7359
SC
2426
2427 current_section =
e20873a7 2428 os =
075d7359
SC
2429 lang_output_section_statement_lookup (output_section_statement_name);
2430
2431
2fa0b342 2432
2fa0b342
DHW
2433 /* Add this statement to tree */
2434 /* add_statement(lang_output_section_statement_enum,
2435 output_section_statement);*/
2436 /* Make next things chain into subchain of this */
2437
2438 if (os->addr_tree ==
075d7359 2439 (etree_type *) NULL)
e20873a7
JG
2440 {
2441 os->addr_tree =
2442 address_exp;
2443 }
7bc4a0d7 2444 os->flags = flags;
ae475b39
SC
2445 if (flags & SEC_NEVER_LOAD)
2446 os->loadable = 0;
2447 else
2448 os->loadable = 1;
29f33467 2449 os->block_value = block_value ? block_value : 1;
075d7359 2450 stat_ptr = &os->children;
2fa0b342 2451
e20873a7
JG
2452 os->subsection_alignment = topower(
2453 exp_get_value_int(subalign, -1,
2454 "subsection alignment",
2455 0));
2456 os->section_alignment = topower(
2457 exp_get_value_int(align, -1,
2458 "section alignment", 0));
9fce28ed 2459
9f629407 2460 os->load_base = ebase;
2fa0b342
DHW
2461}
2462
9fce28ed 2463
075d7359 2464void
8ddef552 2465lang_final ()
2fa0b342 2466{
2c6635a4
ILT
2467 lang_output_statement_type *new =
2468 new_stat (lang_output_statement, stat_ptr);
2fa0b342 2469
2c6635a4 2470 new->name = output_filename;
075d7359 2471}
2fa0b342 2472
c611e285
SC
2473/* Reset the current counters in the regions */
2474static void
8ddef552 2475reset_memory_regions ()
c611e285 2476{
075d7359
SC
2477 lang_memory_region_type *p = lang_memory_region_list;
2478
c611e285 2479 for (p = lang_memory_region_list;
075d7359
SC
2480 p != (lang_memory_region_type *) NULL;
2481 p = p->next)
2482 {
8ddef552 2483 p->old_length = (bfd_size_type) (p->current - p->origin);
075d7359
SC
2484 p->current = p->origin;
2485 }
c611e285 2486}
2fa0b342 2487
2fa0b342 2488void
8ddef552 2489lang_process ()
075d7359 2490{
075d7359 2491 lang_reasonable_defaults ();
1418c83b
SC
2492 current_target = default_target;
2493
075d7359 2494 lang_for_each_statement (ldlang_open_output); /* Open the output file */
1418c83b 2495
97fbbaca
JL
2496 ldemul_create_output_section_statements ();
2497
1418c83b 2498 /* Add to the hash table all undefineds on the command line */
075d7359 2499 lang_place_undefineds ();
1418c83b
SC
2500
2501 /* Create a bfd for each input file */
2502 current_target = default_target;
075d7359 2503 lang_for_each_statement (open_input_bfds);
1418c83b 2504
c477527c
ILT
2505 /* Build all sets based on the information gathered from the input
2506 files. */
2507 ldctor_build_sets ();
2508
4fdbafb2
ILT
2509 /* Size up the common data */
2510 lang_common ();
2511
1418c83b 2512 /* Run through the contours of the script and attatch input sections
075d7359 2513 to the correct output sections
1418c83b 2514 */
075d7359
SC
2515 map_input_to_output_sections (statement_list.head, (char *) NULL,
2516 (lang_output_section_statement_type *) NULL);
1418c83b 2517
81016051 2518
1418c83b 2519 /* Find any sections not attatched explicitly and handle them */
075d7359 2520 lang_place_orphans ();
1418c83b 2521
075d7359 2522 ldemul_before_allocation ();
1418c83b 2523
c611e285 2524 /* Now run around and relax if we can */
075d7359 2525 if (command_line.relax)
c611e285 2526 {
97fbbaca
JL
2527 /* First time round is a trial run to get the 'worst case'
2528 addresses of the objects if there was no relaxing. */
ae475b39 2529 lang_size_sections (statement_list.head,
193c5f93 2530 abs_output_section,
ae475b39 2531 &(statement_list.head), 0, (bfd_vma) 0, false);
c611e285 2532
075d7359 2533
97fbbaca 2534 reset_memory_regions ();
075d7359 2535
193c5f93
ILT
2536 /* Keep relaxing until bfd_relax_section gives up. */
2537 do
2538 {
2539 relax_again = false;
ae475b39 2540
193c5f93
ILT
2541 /* Do all the assignments with our current guesses as to
2542 section sizes. */
2543 lang_do_assignments (statement_list.head,
2544 abs_output_section,
2545 (fill_type) 0, (bfd_vma) 0);
ae475b39 2546
193c5f93
ILT
2547 /* Perform another relax pass - this time we know where the
2548 globals are, so can make better guess. */
2549 lang_size_sections (statement_list.head,
2550 abs_output_section,
2551 &(statement_list.head), 0, (bfd_vma) 0, true);
2552 }
2553 while (relax_again);
ae475b39 2554 }
ae475b39
SC
2555 else
2556 {
97fbbaca 2557 /* Size up the sections. */
ae475b39
SC
2558 lang_size_sections (statement_list.head,
2559 abs_output_section,
2560 &(statement_list.head), 0, (bfd_vma) 0, false);
075d7359 2561 }
c611e285 2562
1418c83b 2563 /* See if anything special should be done now we know how big
97fbbaca 2564 everything is. */
075d7359 2565 ldemul_after_allocation ();
1418c83b
SC
2566
2567 /* Do all the assignments, now that we know the final restingplaces
2568 of all the symbols */
2569
075d7359
SC
2570 lang_do_assignments (statement_list.head,
2571 abs_output_section,
c477527c 2572 (fill_type) 0, (bfd_vma) 0);
ffc50032 2573
1418c83b
SC
2574 /* Make sure that we're not mixing architectures */
2575
075d7359 2576 lang_check ();
1418c83b 2577
1418c83b 2578 /* Final stuffs */
97fbbaca
JL
2579
2580 ldemul_finish ();
075d7359 2581 lang_finish ();
2fa0b342
DHW
2582}
2583
2fa0b342 2584/* EXPORTED TO YACC */
1418c83b 2585
2fa0b342 2586void
8ddef552
DM
2587lang_add_wild (section_name, filename)
2588 CONST char *CONST section_name;
2589 CONST char *CONST filename;
1418c83b 2590{
075d7359
SC
2591 lang_wild_statement_type *new = new_stat (lang_wild_statement,
2592 stat_ptr);
1418c83b 2593
075d7359
SC
2594 if (section_name != (char *) NULL && strcmp (section_name, "COMMON") == 0)
2595 {
2596 placed_commons = true;
2597 }
2598 if (filename != (char *) NULL)
2599 {
2600 lang_has_input_file = true;
2601 }
1418c83b
SC
2602 new->section_name = section_name;
2603 new->filename = filename;
075d7359 2604 lang_list_init (&new->children);
1418c83b 2605}
075d7359 2606
1418c83b 2607void
8ddef552
DM
2608lang_section_start (name, address)
2609 CONST char *name;
2610 etree_type * address;
2fa0b342 2611{
075d7359
SC
2612 lang_address_statement_type *ad = new_stat (lang_address_statement, stat_ptr);
2613
2fa0b342
DHW
2614 ad->section_name = name;
2615 ad->address = address;
2616}
1418c83b 2617
60e8a534
ILT
2618/* Set the start symbol to NAME. CMDLINE is nonzero if this is called
2619 because of a -e argument on the command line, or zero if this is
2620 called by ENTRY in a linker script. Command line arguments take
2621 precedence. */
2622
075d7359 2623void
60e8a534 2624lang_add_entry (name, cmdline)
8ddef552 2625 CONST char *name;
60e8a534 2626 int cmdline;
2fa0b342 2627{
60e8a534
ILT
2628 static int from_cmdline;
2629
2630 if (entry_symbol == NULL
2631 || cmdline
2632 || ! from_cmdline)
2633 {
2634 entry_symbol = name;
2635 from_cmdline = cmdline;
2636 }
2fa0b342
DHW
2637}
2638
2639void
8ddef552
DM
2640lang_add_target (name)
2641 CONST char *name;
2fa0b342 2642{
075d7359
SC
2643 lang_target_statement_type *new = new_stat (lang_target_statement,
2644 stat_ptr);
2645
2fa0b342
DHW
2646 new->target = name;
2647
2648}
2fa0b342 2649
2fa0b342 2650void
8ddef552
DM
2651lang_add_map (name)
2652 CONST char *name;
2fa0b342 2653{
075d7359
SC
2654 while (*name)
2655 {
2656 switch (*name)
2657 {
2658 case 'F':
2659 map_option_f = true;
2660 break;
2661 }
2662 name++;
2fa0b342 2663 }
2fa0b342
DHW
2664}
2665
075d7359 2666void
8ddef552
DM
2667lang_add_fill (exp)
2668 int exp;
2fa0b342 2669{
075d7359
SC
2670 lang_fill_statement_type *new = new_stat (lang_fill_statement,
2671 stat_ptr);
2672
2fa0b342
DHW
2673 new->fill = exp;
2674}
2675
075d7359 2676void
8ddef552
DM
2677lang_add_data (type, exp)
2678 int type;
2679 union etree_union *exp;
2fa0b342
DHW
2680{
2681
075d7359 2682 lang_data_statement_type *new = new_stat (lang_data_statement,
2fa0b342 2683 stat_ptr);
075d7359
SC
2684
2685 new->exp = exp;
2686 new->type = type;
2fa0b342
DHW
2687
2688}
075d7359 2689
4fdbafb2
ILT
2690/* Create a new reloc statement. RELOC is the BFD relocation type to
2691 generate. HOWTO is the corresponding howto structure (we could
2692 look this up, but the caller has already done so). SECTION is the
2693 section to generate a reloc against, or NAME is the name of the
2694 symbol to generate a reloc against. Exactly one of SECTION and
2695 NAME must be NULL. ADDEND is an expression for the addend. */
2696
2697void
2698lang_add_reloc (reloc, howto, section, name, addend)
2699 bfd_reloc_code_real_type reloc;
2700 const reloc_howto_type *howto;
2701 asection *section;
2702 const char *name;
2703 union etree_union *addend;
2704{
2705 lang_reloc_statement_type *p = new_stat (lang_reloc_statement, stat_ptr);
2706
2707 p->reloc = reloc;
2708 p->howto = howto;
2709 p->section = section;
2710 p->name = name;
2711 p->addend_exp = addend;
2712
2713 p->addend_value = 0;
2714 p->output_section = NULL;
2715 p->output_vma = 0;
2716}
2717
2fa0b342 2718void
8ddef552
DM
2719lang_add_assignment (exp)
2720 etree_type * exp;
2fa0b342 2721{
075d7359
SC
2722 lang_assignment_statement_type *new = new_stat (lang_assignment_statement,
2723 stat_ptr);
2724
2fa0b342
DHW
2725 new->exp = exp;
2726}
2727
2728void
8ddef552
DM
2729lang_add_attribute (attribute)
2730 enum statement_enum attribute;
2fa0b342 2731{
075d7359 2732 new_statement (attribute, sizeof (lang_statement_union_type), stat_ptr);
2fa0b342
DHW
2733}
2734
075d7359 2735void
8ddef552
DM
2736lang_startup (name)
2737 CONST char *name;
2fa0b342 2738{
075d7359
SC
2739 if (startup_file != (char *) NULL)
2740 {
ddddcdf0 2741 einfo ("%P%Fmultiple STARTUP files\n");
075d7359 2742 }
2fa0b342
DHW
2743 first_file->filename = name;
2744 first_file->local_sym_name = name;
193c5f93 2745 first_file->real = true;
2fa0b342 2746
075d7359 2747 startup_file = name;
2fa0b342 2748}
075d7359
SC
2749
2750void
8ddef552
DM
2751lang_float (maybe)
2752 boolean maybe;
2fa0b342
DHW
2753{
2754 lang_float_flag = maybe;
2755}
2756
075d7359 2757void
8ddef552
DM
2758lang_leave_output_section_statement (fill, memspec)
2759 bfd_vma fill;
2760 CONST char *memspec;
2fa0b342
DHW
2761{
2762 current_section->fill = fill;
075d7359 2763 current_section->region = lang_memory_region_lookup (memspec);
2fa0b342 2764 stat_ptr = &statement_list;
81016051
SC
2765
2766 /* We remember if we are closing a .data section, since we use it to
2767 store constructors in */
075d7359
SC
2768 if (strcmp (current_section->name, ".data") == 0)
2769 {
2770 end_of_data_section_statement_list = statement_list;
81016051 2771
075d7359 2772 }
2fa0b342 2773}
075d7359 2774
9f32f7c2
SC
2775/*
2776 Create an absolute symbol with the given name with the value of the
2777 address of first byte of the section named.
2fa0b342 2778
9f32f7c2
SC
2779 If the symbol already exists, then do nothing.
2780*/
8cb5eb31 2781void
c477527c
ILT
2782lang_abs_symbol_at_beginning_of (secname, name)
2783 const char *secname;
2784 const char *name;
075d7359 2785{
c477527c
ILT
2786 struct bfd_link_hash_entry *h;
2787
2788 h = bfd_link_hash_lookup (link_info.hash, name, true, true, true);
2789 if (h == (struct bfd_link_hash_entry *) NULL)
2790 einfo ("%P%F: bfd_link_hash_lookup failed: %E\n");
2791
2792 if (h->type == bfd_link_hash_new
2793 || h->type == bfd_link_hash_undefined)
075d7359 2794 {
c477527c 2795 asection *sec;
075d7359 2796
c477527c
ILT
2797 h->type = bfd_link_hash_defined;
2798
2799 sec = bfd_get_section_by_name (output_bfd, secname);
2800 if (sec == (asection *) NULL)
2801 h->u.def.value = 0;
075d7359 2802 else
c477527c
ILT
2803 h->u.def.value = bfd_get_section_vma (output_bfd, sec);
2804
2805 h->u.def.section = &bfd_abs_section;
9f32f7c2 2806 }
8cb5eb31
SC
2807}
2808
9f32f7c2
SC
2809/*
2810 Create an absolute symbol with the given name with the value of the
2811 address of the first byte after the end of the section named.
2812
2813 If the symbol already exists, then do nothing.
2814*/
2fa0b342 2815void
c477527c
ILT
2816lang_abs_symbol_at_end_of (secname, name)
2817 const char *secname;
2818 const char *name;
075d7359 2819{
c477527c
ILT
2820 struct bfd_link_hash_entry *h;
2821
2822 h = bfd_link_hash_lookup (link_info.hash, name, true, true, true);
2823 if (h == (struct bfd_link_hash_entry *) NULL)
2824 einfo ("%P%F: bfd_link_hash_lookup failed: %E\n");
2825
2826 if (h->type == bfd_link_hash_new
2827 || h->type == bfd_link_hash_undefined)
075d7359 2828 {
c477527c 2829 asection *sec;
075d7359 2830
c477527c 2831 h->type = bfd_link_hash_defined;
075d7359 2832
c477527c
ILT
2833 sec = bfd_get_section_by_name (output_bfd, secname);
2834 if (sec == (asection *) NULL)
2835 h->u.def.value = 0;
075d7359 2836 else
c477527c
ILT
2837 h->u.def.value = (bfd_get_section_vma (output_bfd, sec)
2838 + bfd_section_size (output_bfd, sec));
2839
2840 h->u.def.section = &bfd_abs_section;
9f32f7c2 2841 }
2fa0b342
DHW
2842}
2843
075d7359 2844void
8ddef552
DM
2845lang_statement_append (list, element, field)
2846 lang_statement_list_type * list;
2847 lang_statement_union_type * element;
2848 lang_statement_union_type ** field;
2fa0b342
DHW
2849{
2850 *(list->tail) = element;
2851 list->tail = field;
2852}
2853
173a0c3d 2854/* Set the output format type. -oformat overrides scripts. */
097879bc 2855void
173a0c3d 2856lang_add_output_format (format, from_script)
8ddef552 2857 CONST char *format;
173a0c3d 2858 int from_script;
097879bc 2859{
2c6635a4 2860 if (output_target == NULL || !from_script)
173a0c3d 2861 output_target = format;
097879bc 2862}
This page took 0.276329 seconds and 4 git commands to generate.