2000-11-07 Dave Brolley <brolley@redhat.com>
[binutils.git] / ld / ldwrite.c
blobe4f176ff089359441709c7be2544f76cfb959f86
1 /* ldwrite.c -- write out the linked file
2 Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 2000
3 Free Software Foundation, Inc.
4 Written by Steve Chamberlain sac@cygnus.com
6 This file is part of GLD, the Gnu Linker.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "bfdlink.h"
25 #include "libiberty.h"
27 #include "ld.h"
28 #include "ldexp.h"
29 #include "ldlang.h"
30 #include "ldwrite.h"
31 #include "ldmisc.h"
32 #include "ldgram.h"
33 #include "ldmain.h"
35 static void build_link_order PARAMS ((lang_statement_union_type *));
36 static asection *clone_section PARAMS ((bfd *, asection *, const char *, int *));
37 static void split_sections PARAMS ((bfd *, struct bfd_link_info *));
39 /* Build link_order structures for the BFD linker. */
41 static void
42 build_link_order (statement)
43 lang_statement_union_type *statement;
45 switch (statement->header.type)
47 case lang_data_statement_enum:
49 asection *output_section;
50 struct bfd_link_order *link_order;
51 bfd_vma value;
52 boolean big_endian = false;
54 output_section = statement->data_statement.output_section;
55 ASSERT (output_section->owner == output_bfd);
57 link_order = bfd_new_link_order (output_bfd, output_section);
58 if (link_order == NULL)
59 einfo (_("%P%F: bfd_new_link_order failed\n"));
61 link_order->type = bfd_data_link_order;
62 link_order->offset = statement->data_statement.output_vma;
63 link_order->u.data.contents = (bfd_byte *) xmalloc (QUAD_SIZE);
65 value = statement->data_statement.value;
67 /* If the endianness of the output BFD is not known, then we
68 base the endianness of the data on the first input file.
69 By convention, the bfd_put routines for an unknown
70 endianness are big endian, so we must swap here if the
71 input file is little endian. */
72 if (bfd_big_endian (output_bfd))
73 big_endian = true;
74 else if (bfd_little_endian (output_bfd))
75 big_endian = false;
76 else
78 boolean swap;
80 swap = false;
81 if (command_line.endian == ENDIAN_BIG)
82 big_endian = true;
83 else if (command_line.endian == ENDIAN_LITTLE)
85 big_endian = false;
86 swap = true;
88 else if (command_line.endian == ENDIAN_UNSET)
90 big_endian = true;
92 LANG_FOR_EACH_INPUT_STATEMENT (s)
94 if (s->the_bfd != NULL)
96 if (bfd_little_endian (s->the_bfd))
98 big_endian = false;
99 swap = true;
101 break;
107 if (swap)
109 bfd_byte buffer[8];
111 switch (statement->data_statement.type)
113 case QUAD:
114 case SQUAD:
115 if (sizeof (bfd_vma) >= QUAD_SIZE)
117 bfd_putl64 (value, buffer);
118 value = bfd_getb64 (buffer);
119 break;
121 /* Fall through. */
122 case LONG:
123 bfd_putl32 (value, buffer);
124 value = bfd_getb32 (buffer);
125 break;
126 case SHORT:
127 bfd_putl16 (value, buffer);
128 value = bfd_getb16 (buffer);
129 break;
130 case BYTE:
131 break;
132 default:
133 abort ();
138 ASSERT (output_section->owner == output_bfd);
139 switch (statement->data_statement.type)
141 case QUAD:
142 case SQUAD:
143 if (sizeof (bfd_vma) >= QUAD_SIZE)
144 bfd_put_64 (output_bfd, value, link_order->u.data.contents);
145 else
147 bfd_vma high;
149 if (statement->data_statement.type == QUAD)
150 high = 0;
151 else if ((value & 0x80000000) == 0)
152 high = 0;
153 else
154 high = (bfd_vma) -1;
155 bfd_put_32 (output_bfd, high,
156 (link_order->u.data.contents
157 + (big_endian ? 0 : 4)));
158 bfd_put_32 (output_bfd, value,
159 (link_order->u.data.contents
160 + (big_endian ? 4 : 0)));
162 link_order->size = QUAD_SIZE;
163 break;
164 case LONG:
165 bfd_put_32 (output_bfd, value, link_order->u.data.contents);
166 link_order->size = LONG_SIZE;
167 break;
168 case SHORT:
169 bfd_put_16 (output_bfd, value, link_order->u.data.contents);
170 link_order->size = SHORT_SIZE;
171 break;
172 case BYTE:
173 bfd_put_8 (output_bfd, value, link_order->u.data.contents);
174 link_order->size = BYTE_SIZE;
175 break;
176 default:
177 abort ();
180 break;
182 case lang_reloc_statement_enum:
184 lang_reloc_statement_type *rs;
185 asection *output_section;
186 struct bfd_link_order *link_order;
188 rs = &statement->reloc_statement;
190 output_section = rs->output_section;
191 ASSERT (output_section->owner == output_bfd);
193 link_order = bfd_new_link_order (output_bfd, output_section);
194 if (link_order == NULL)
195 einfo (_("%P%F: bfd_new_link_order failed\n"));
197 link_order->offset = rs->output_vma;
198 link_order->size = bfd_get_reloc_size (rs->howto);
200 link_order->u.reloc.p =
201 ((struct bfd_link_order_reloc *)
202 xmalloc (sizeof (struct bfd_link_order_reloc)));
204 link_order->u.reloc.p->reloc = rs->reloc;
205 link_order->u.reloc.p->addend = rs->addend_value;
207 if (rs->name == NULL)
209 link_order->type = bfd_section_reloc_link_order;
210 if (rs->section->owner == output_bfd)
211 link_order->u.reloc.p->u.section = rs->section;
212 else
214 link_order->u.reloc.p->u.section = rs->section->output_section;
215 link_order->u.reloc.p->addend += rs->section->output_offset;
218 else
220 link_order->type = bfd_symbol_reloc_link_order;
221 link_order->u.reloc.p->u.name = rs->name;
224 break;
226 case lang_input_section_enum:
227 /* Create a new link_order in the output section with this
228 attached */
229 if (statement->input_section.ifile->just_syms_flag == false)
231 asection *i = statement->input_section.section;
232 asection *output_section = i->output_section;
234 ASSERT (output_section->owner == output_bfd);
236 if ((output_section->flags & SEC_HAS_CONTENTS) != 0)
238 struct bfd_link_order *link_order;
240 link_order = bfd_new_link_order (output_bfd, output_section);
242 if (i->flags & SEC_NEVER_LOAD)
244 /* We've got a never load section inside one which
245 is going to be output, we'll change it into a
246 fill link_order */
247 link_order->type = bfd_fill_link_order;
248 link_order->u.fill.value = 0;
250 else
252 link_order->type = bfd_indirect_link_order;
253 link_order->u.indirect.section = i;
254 ASSERT (i->output_section == output_section);
256 if (i->_cooked_size)
257 link_order->size = i->_cooked_size;
258 else
259 link_order->size = bfd_get_section_size_before_reloc (i);
260 link_order->offset = i->output_offset;
263 break;
265 case lang_padding_statement_enum:
266 /* Make a new link_order with the right filler */
268 asection *output_section;
269 struct bfd_link_order *link_order;
271 output_section = statement->padding_statement.output_section;
272 ASSERT (statement->padding_statement.output_section->owner
273 == output_bfd);
274 if ((output_section->flags & SEC_HAS_CONTENTS) != 0)
276 link_order = bfd_new_link_order (output_bfd, output_section);
277 link_order->type = bfd_fill_link_order;
278 link_order->size = statement->padding_statement.size;
279 link_order->offset = statement->padding_statement.output_offset;
280 link_order->u.fill.value = statement->padding_statement.fill;
283 break;
285 default:
286 /* All the other ones fall through */
287 break;
291 /* Call BFD to write out the linked file. */
293 /**********************************************************************/
295 /* Wander around the input sections, make sure that
296 we'll never try and create an output section with more relocs
297 than will fit.. Do this by always assuming the worst case, and
298 creating new output sections with all the right bits. */
299 #define TESTIT 1
300 static asection *
301 clone_section (abfd, s, name, count)
302 bfd *abfd;
303 asection *s;
304 const char *name;
305 int *count;
307 char templ[6];
308 char *sname;
309 asection *n;
310 struct bfd_link_hash_entry *h;
312 /* Invent a section name from the first five chars of the base
313 section name and a digit suffix. */
314 strncpy (templ, name, sizeof (templ) - 1);
315 templ[sizeof (templ) - 1] = '\0';
316 if ((sname = bfd_get_unique_section_name (abfd, templ, count)) == NULL
317 || (n = bfd_make_section_anyway (abfd, sname)) == NULL
318 || (h = bfd_link_hash_lookup (link_info.hash,
319 sname, true, true, false)) == NULL)
321 einfo (_("%F%P: clone section failed: %E\n"));
322 /* Silence gcc warnings. einfo exits, so we never reach here. */
323 return NULL;
326 /* Set up section symbol. */
327 h->type = bfd_link_hash_defined;
328 h->u.def.value = 0;
329 h->u.def.section = n;
331 n->flags = s->flags;
332 n->vma = s->vma;
333 n->user_set_vma = s->user_set_vma;
334 n->lma = s->lma;
335 n->_cooked_size = 0;
336 n->_raw_size = 0;
337 n->output_offset = s->output_offset;
338 n->output_section = n;
339 n->orelocation = 0;
340 n->reloc_count = 0;
341 n->alignment_power = s->alignment_power;
342 return n;
345 #if TESTING
346 static void
347 ds (s)
348 asection *s;
350 struct bfd_link_order *l = s->link_order_head;
351 printf ("vma %x size %x\n", s->vma, s->_raw_size);
352 while (l)
354 if (l->type == bfd_indirect_link_order)
356 printf ("%8x %s\n", l->offset, l->u.indirect.section->owner->filename);
358 else
360 printf (_("%8x something else\n"), l->offset);
362 l = l->next;
364 printf ("\n");
367 dump (s, a1, a2)
368 char *s;
369 asection *a1;
370 asection *a2;
372 printf ("%s\n", s);
373 ds (a1);
374 ds (a2);
377 static void
378 sanity_check (abfd)
379 bfd *abfd;
381 asection *s;
382 for (s = abfd->sections; s; s = s->next)
384 struct bfd_link_order *p;
385 bfd_vma prev = 0;
386 for (p = s->link_order_head; p; p = p->next)
388 if (p->offset > 100000)
389 abort ();
390 if (p->offset < prev)
391 abort ();
392 prev = p->offset;
396 #else
397 #define sanity_check(a)
398 #define dump(a, b, c)
399 #endif
401 static void
402 split_sections (abfd, info)
403 bfd *abfd;
404 struct bfd_link_info *info;
406 asection *original_sec;
407 int nsecs = abfd->section_count;
408 sanity_check (abfd);
409 /* Look through all the original sections. */
410 for (original_sec = abfd->sections;
411 original_sec && nsecs;
412 original_sec = original_sec->next, nsecs--)
414 int count = 0;
415 unsigned int lines = 0;
416 unsigned int relocs = 0;
417 bfd_size_type sec_size = 0;
418 struct bfd_link_order *l;
419 struct bfd_link_order *p;
420 bfd_vma vma = original_sec->vma;
421 asection *cursor = original_sec;
423 /* Count up the relocations and line entries to see if anything
424 would be too big to fit. Accumulate section size too. */
425 for (l = NULL, p = cursor->link_order_head; p != NULL; p = l->next)
427 unsigned int thislines = 0;
428 unsigned int thisrelocs = 0;
429 bfd_size_type thissize = 0;
430 if (p->type == bfd_indirect_link_order)
432 asection *sec;
434 sec = p->u.indirect.section;
436 if (info->strip == strip_none
437 || info->strip == strip_some)
438 thislines = sec->lineno_count;
440 if (info->relocateable)
441 thisrelocs = sec->reloc_count;
443 if (sec->_cooked_size != 0)
444 thissize = sec->_cooked_size;
445 else
446 thissize = sec->_raw_size;
449 else if (info->relocateable
450 && (p->type == bfd_section_reloc_link_order
451 || p->type == bfd_symbol_reloc_link_order))
452 thisrelocs++;
454 if (l != NULL
455 && (thisrelocs + relocs >= config.split_by_reloc
456 || thislines + lines >= config.split_by_reloc
457 || thissize + sec_size >= config.split_by_file))
459 /* Create a new section and put this link order and the
460 following link orders into it. */
461 bfd_vma shift_offset;
462 asection *n;
464 n = clone_section (abfd, cursor, original_sec->name, &count);
466 /* Attach the link orders to the new section and snip
467 them off from the old section. */
468 n->link_order_head = p;
469 n->link_order_tail = cursor->link_order_tail;
470 cursor->link_order_tail = l;
471 l->next = NULL;
472 l = p;
474 /* Change the size of the original section and
475 update the vma of the new one. */
477 dump ("before snip", cursor, n);
479 shift_offset = p->offset;
480 if (cursor->_cooked_size != 0)
482 n->_cooked_size = cursor->_cooked_size - shift_offset;
483 cursor->_cooked_size = shift_offset;
485 n->_raw_size = cursor->_raw_size - shift_offset;
486 cursor->_raw_size = shift_offset;
488 vma += shift_offset;
489 n->lma = n->vma = vma;
491 /* Run down the chain and change the output section to
492 the right one, update the offsets too. */
495 p->offset -= shift_offset;
496 if (p->type == bfd_indirect_link_order)
498 p->u.indirect.section->output_section = n;
499 p->u.indirect.section->output_offset = p->offset;
501 p = p->next;
503 while (p);
505 dump ("after snip", cursor, n);
506 cursor = n;
507 relocs = thisrelocs;
508 lines = thislines;
509 sec_size = thissize;
511 else
513 l = p;
514 relocs += thisrelocs;
515 lines += thislines;
516 sec_size += thissize;
520 sanity_check (abfd);
523 /**********************************************************************/
525 void
526 ldwrite ()
528 /* Reset error indicator, which can typically something like invalid
529 format from opening up the .o files. */
530 bfd_set_error (bfd_error_no_error);
531 lang_for_each_statement (build_link_order);
533 if (config.split_by_reloc != (unsigned) -1
534 || config.split_by_file != (bfd_size_type) -1)
535 split_sections (output_bfd, &link_info);
536 if (!bfd_final_link (output_bfd, &link_info))
538 /* If there was an error recorded, print it out. Otherwise assume
539 an appropriate error message like unknown symbol was printed
540 out. */
542 if (bfd_get_error () != bfd_error_no_error)
543 einfo (_("%F%P: final link failed: %E\n"));
544 else
545 xexit (1);