1 /* ldwrite.c -- write out the linked file
2 Copyright (C) 1991-2015 Free Software Foundation, Inc.
3 Written by Steve Chamberlain sac@cygnus.com
5 This file is part of the GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
25 #include "libiberty.h"
26 #include "safe-ctype.h"
36 /* Build link_order structures for the BFD linker. */
39 build_link_order (lang_statement_union_type *statement)
41 switch (statement->header.type)
43 case lang_data_statement_enum:
45 asection *output_section;
46 struct bfd_link_order *link_order;
48 bfd_boolean big_endian = FALSE;
50 output_section = statement->data_statement.output_section;
51 ASSERT (output_section->owner == link_info.output_bfd);
53 if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
54 || ((output_section->flags & SEC_LOAD) != 0
55 && (output_section->flags & SEC_THREAD_LOCAL))))
58 link_order = bfd_new_link_order (link_info.output_bfd, output_section);
59 if (link_order == NULL)
60 einfo (_("%P%F: bfd_new_link_order failed\n"));
62 link_order->type = bfd_data_link_order;
63 link_order->offset = statement->data_statement.output_offset;
64 link_order->u.data.contents = (bfd_byte *) xmalloc (QUAD_SIZE);
66 value = statement->data_statement.value;
68 /* If the endianness of the output BFD is not known, then we
69 base the endianness of the data on the first input file.
70 By convention, the bfd_put routines for an unknown
71 endianness are big endian, so we must swap here if the
72 input file is little endian. */
73 if (bfd_big_endian (link_info.output_bfd))
75 else if (bfd_little_endian (link_info.output_bfd))
82 if (command_line.endian == ENDIAN_BIG)
84 else if (command_line.endian == ENDIAN_LITTLE)
89 else if (command_line.endian == ENDIAN_UNSET)
93 LANG_FOR_EACH_INPUT_STATEMENT (s)
95 if (s->the_bfd != NULL)
97 if (bfd_little_endian (s->the_bfd))
112 switch (statement->data_statement.type)
116 if (sizeof (bfd_vma) >= QUAD_SIZE)
118 bfd_putl64 (value, buffer);
119 value = bfd_getb64 (buffer);
124 bfd_putl32 (value, buffer);
125 value = bfd_getb32 (buffer);
128 bfd_putl16 (value, buffer);
129 value = bfd_getb16 (buffer);
139 ASSERT (output_section->owner == link_info.output_bfd);
140 switch (statement->data_statement.type)
144 if (sizeof (bfd_vma) >= QUAD_SIZE)
145 bfd_put_64 (link_info.output_bfd, value,
146 link_order->u.data.contents);
151 if (statement->data_statement.type == QUAD)
153 else if ((value & 0x80000000) == 0)
157 bfd_put_32 (link_info.output_bfd, high,
158 (link_order->u.data.contents
159 + (big_endian ? 0 : 4)));
160 bfd_put_32 (link_info.output_bfd, value,
161 (link_order->u.data.contents
162 + (big_endian ? 4 : 0)));
164 link_order->size = QUAD_SIZE;
167 bfd_put_32 (link_info.output_bfd, value,
168 link_order->u.data.contents);
169 link_order->size = LONG_SIZE;
172 bfd_put_16 (link_info.output_bfd, value,
173 link_order->u.data.contents);
174 link_order->size = SHORT_SIZE;
177 bfd_put_8 (link_info.output_bfd, value,
178 link_order->u.data.contents);
179 link_order->size = BYTE_SIZE;
184 link_order->u.data.size = link_order->size;
188 case lang_reloc_statement_enum:
190 lang_reloc_statement_type *rs;
191 asection *output_section;
192 struct bfd_link_order *link_order;
194 rs = &statement->reloc_statement;
196 output_section = rs->output_section;
197 ASSERT (output_section->owner == link_info.output_bfd);
199 if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
200 || ((output_section->flags & SEC_LOAD) != 0
201 && (output_section->flags & SEC_THREAD_LOCAL))))
204 link_order = bfd_new_link_order (link_info.output_bfd, output_section);
205 if (link_order == NULL)
206 einfo (_("%P%F: bfd_new_link_order failed\n"));
208 link_order->offset = rs->output_offset;
209 link_order->size = bfd_get_reloc_size (rs->howto);
211 link_order->u.reloc.p = (struct bfd_link_order_reloc *)
212 xmalloc (sizeof (struct bfd_link_order_reloc));
214 link_order->u.reloc.p->reloc = rs->reloc;
215 link_order->u.reloc.p->addend = rs->addend_value;
217 if (rs->name == NULL)
219 link_order->type = bfd_section_reloc_link_order;
220 if (rs->section->owner == link_info.output_bfd)
221 link_order->u.reloc.p->u.section = rs->section;
224 link_order->u.reloc.p->u.section = rs->section->output_section;
225 link_order->u.reloc.p->addend += rs->section->output_offset;
230 link_order->type = bfd_symbol_reloc_link_order;
231 link_order->u.reloc.p->u.name = rs->name;
236 case lang_input_section_enum:
238 /* Create a new link_order in the output section with this
240 asection *i = statement->input_section.section;
242 if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
243 && (i->flags & SEC_EXCLUDE) == 0)
245 asection *output_section = i->output_section;
246 struct bfd_link_order *link_order;
248 ASSERT (output_section->owner == link_info.output_bfd);
250 if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
251 || ((output_section->flags & SEC_LOAD) != 0
252 && (output_section->flags & SEC_THREAD_LOCAL))))
255 link_order = bfd_new_link_order (link_info.output_bfd,
258 if ((i->flags & SEC_NEVER_LOAD) != 0
259 && (i->flags & SEC_DEBUGGING) == 0)
261 /* We've got a never load section inside one which is
262 going to be output, we'll change it into a fill. */
263 link_order->type = bfd_data_link_order;
264 link_order->u.data.contents = (unsigned char *) "";
265 link_order->u.data.size = 1;
269 link_order->type = bfd_indirect_link_order;
270 link_order->u.indirect.section = i;
271 ASSERT (i->output_section == output_section);
273 link_order->size = i->size;
274 link_order->offset = i->output_offset;
279 case lang_padding_statement_enum:
280 /* Make a new link_order with the right filler */
282 asection *output_section;
283 struct bfd_link_order *link_order;
285 output_section = statement->padding_statement.output_section;
286 ASSERT (statement->padding_statement.output_section->owner
287 == link_info.output_bfd);
289 if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
290 || ((output_section->flags & SEC_LOAD) != 0
291 && (output_section->flags & SEC_THREAD_LOCAL))))
294 link_order = bfd_new_link_order (link_info.output_bfd,
296 link_order->type = bfd_data_link_order;
297 link_order->size = statement->padding_statement.size;
298 link_order->offset = statement->padding_statement.output_offset;
299 link_order->u.data.contents = statement->padding_statement.fill->data;
300 link_order->u.data.size = statement->padding_statement.fill->size;
305 /* All the other ones fall through */
310 /* Return true if NAME is the name of an unsplittable section. These
311 are the stabs strings, dwarf strings. */
314 unsplittable_name (const char *name)
316 if (CONST_STRNEQ (name, ".stab"))
318 /* There are several stab like string sections. We pattern match on
320 unsigned len = strlen (name);
321 if (strcmp (&name[len-3], "str") == 0)
324 else if (strcmp (name, "$GDB_STRINGS$") == 0)
329 /* Wander around the input sections, make sure that
330 we'll never try and create an output section with more relocs
331 than will fit.. Do this by always assuming the worst case, and
332 creating new output sections with all the right bits. */
335 clone_section (bfd *abfd, asection *s, const char *name, int *count)
341 struct bfd_link_hash_entry *h;
343 /* Invent a section name from the section name and a dotted numeric
346 tname = (char *) xmalloc (len + 1);
347 memcpy (tname, name, len + 1);
348 /* Remove a dotted number suffix, from a previous split link. */
349 while (len && ISDIGIT (tname[len-1]))
351 if (len > 1 && tname[len-1] == '.')
352 /* It was a dotted number. */
355 /* We want to use the whole of the original section name for the
356 split name, but coff can be restricted to 8 character names. */
357 if (bfd_family_coff (abfd) && strlen (tname) > 5)
359 /* Some section names cannot be truncated, as the name is
360 used to locate some other section. */
361 if (CONST_STRNEQ (name, ".stab")
362 || strcmp (name, "$GDB_SYMBOLS$") == 0)
364 einfo (_ ("%F%P: cannot create split section name for %s\n"), name);
365 /* Silence gcc warnings. einfo exits, so we never reach here. */
371 if ((sname = bfd_get_unique_section_name (abfd, tname, count)) == NULL
372 || (n = bfd_make_section_anyway (abfd, sname)) == NULL
373 || (h = bfd_link_hash_lookup (link_info.hash,
374 sname, TRUE, TRUE, FALSE)) == NULL)
376 einfo (_("%F%P: clone section failed: %E\n"));
377 /* Silence gcc warnings. einfo exits, so we never reach here. */
382 /* Set up section symbol. */
383 h->type = bfd_link_hash_defined;
385 h->u.def.section = n;
389 n->user_set_vma = s->user_set_vma;
392 n->output_offset = s->output_offset;
393 n->output_section = n;
396 n->alignment_power = s->alignment_power;
398 bfd_copy_private_section_data (abfd, s, abfd, n);
407 struct bfd_link_order *l = s->map_head.link_order;
408 printf ("vma %x size %x\n", s->vma, s->size);
411 if (l->type == bfd_indirect_link_order)
413 printf ("%8x %s\n", l->offset, l->u.indirect.section->owner->filename);
417 printf (_("%8x something else\n"), l->offset);
424 dump (char *s, asection *a1, asection *a2)
432 sanity_check (bfd *abfd)
435 for (s = abfd->sections; s; s = s->next)
437 struct bfd_link_order *p;
439 for (p = s->map_head.link_order; p; p = p->next)
441 if (p->offset > 100000)
443 if (p->offset < prev)
450 #define sanity_check(a)
451 #define dump(a, b, c)
455 split_sections (bfd *abfd, struct bfd_link_info *info)
457 asection *original_sec;
458 int nsecs = abfd->section_count;
460 /* Look through all the original sections. */
461 for (original_sec = abfd->sections;
462 original_sec && nsecs;
463 original_sec = original_sec->next, nsecs--)
466 unsigned int lines = 0;
467 unsigned int relocs = 0;
468 bfd_size_type sec_size = 0;
469 struct bfd_link_order *l;
470 struct bfd_link_order *p;
471 bfd_vma vma = original_sec->vma;
472 asection *cursor = original_sec;
474 /* Count up the relocations and line entries to see if anything
475 would be too big to fit. Accumulate section size too. */
476 for (l = NULL, p = cursor->map_head.link_order; p != NULL; p = l->next)
478 unsigned int thislines = 0;
479 unsigned int thisrelocs = 0;
480 bfd_size_type thissize = 0;
481 if (p->type == bfd_indirect_link_order)
485 sec = p->u.indirect.section;
487 if (info->strip == strip_none
488 || info->strip == strip_some)
489 thislines = sec->lineno_count;
491 if (bfd_link_relocatable (info))
492 thisrelocs = sec->reloc_count;
494 thissize = sec->size;
497 else if (bfd_link_relocatable (info)
498 && (p->type == bfd_section_reloc_link_order
499 || p->type == bfd_symbol_reloc_link_order))
503 && (thisrelocs + relocs >= config.split_by_reloc
504 || thislines + lines >= config.split_by_reloc
505 || (thissize + sec_size >= config.split_by_file))
506 && !unsplittable_name (cursor->name))
508 /* Create a new section and put this link order and the
509 following link orders into it. */
510 bfd_vma shift_offset;
513 n = clone_section (abfd, cursor, original_sec->name, &count);
515 /* Attach the link orders to the new section and snip
516 them off from the old section. */
517 n->map_head.link_order = p;
518 n->map_tail.link_order = cursor->map_tail.link_order;
519 cursor->map_tail.link_order = l;
523 /* Change the size of the original section and
524 update the vma of the new one. */
526 dump ("before snip", cursor, n);
528 shift_offset = p->offset;
529 n->size = cursor->size - shift_offset;
530 cursor->size = shift_offset;
533 n->lma = n->vma = vma;
535 /* Run down the chain and change the output section to
536 the right one, update the offsets too. */
539 p->offset -= shift_offset;
540 if (p->type == bfd_indirect_link_order)
542 p->u.indirect.section->output_section = n;
543 p->u.indirect.section->output_offset = p->offset;
549 dump ("after snip", cursor, n);
558 relocs += thisrelocs;
560 sec_size += thissize;
567 /* Call BFD to write out the linked file. */
572 /* Reset error indicator, which can typically something like invalid
573 format from opening up the .o files. */
574 bfd_set_error (bfd_error_no_error);
575 lang_clear_os_map ();
576 lang_for_each_statement (build_link_order);
578 if (config.split_by_reloc != (unsigned) -1
579 || config.split_by_file != (bfd_size_type) -1)
580 split_sections (link_info.output_bfd, &link_info);
581 if (!bfd_final_link (link_info.output_bfd, &link_info))
583 /* If there was an error recorded, print it out. Otherwise assume
584 an appropriate error message like unknown symbol was printed
587 if (bfd_get_error () != bfd_error_no_error)
588 einfo (_("%F%P: final link failed: %E\n"));