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