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