xref: /netbsd-src/external/gpl3/binutils/dist/ld/ldwrite.c (revision 6a493d6bc668897c91594964a732d38505b70cbb)
1 /* ldwrite.c -- write out the linked file
2    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002,
3    2003, 2004, 2005, 2006, 2007, 2008, 2010, 2012
4    Free Software Foundation, Inc.
5    Written by Steve Chamberlain sac@cygnus.com
6 
7    This file is part of the GNU Binutils.
8 
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22    MA 02110-1301, USA.  */
23 
24 #include "sysdep.h"
25 #include "bfd.h"
26 #include "bfdlink.h"
27 #include "libiberty.h"
28 #include "safe-ctype.h"
29 
30 #include "ld.h"
31 #include "ldexp.h"
32 #include "ldlang.h"
33 #include "ldwrite.h"
34 #include "ldmisc.h"
35 #include <ldgram.h>
36 #include "ldmain.h"
37 
38 /* Build link_order structures for the BFD linker.  */
39 
40 static void
41 build_link_order (lang_statement_union_type *statement)
42 {
43   switch (statement->header.type)
44     {
45     case lang_data_statement_enum:
46       {
47 	asection *output_section;
48 	struct bfd_link_order *link_order;
49 	bfd_vma value;
50 	bfd_boolean big_endian = FALSE;
51 
52 	output_section = statement->data_statement.output_section;
53 	ASSERT (output_section->owner == link_info.output_bfd);
54 
55 	if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
56 	      || ((output_section->flags & SEC_LOAD) != 0
57 		  && (output_section->flags & SEC_THREAD_LOCAL))))
58 	  break;
59 
60 	link_order = bfd_new_link_order (link_info.output_bfd, output_section);
61 	if (link_order == NULL)
62 	  einfo (_("%P%F: bfd_new_link_order failed\n"));
63 
64 	link_order->type = bfd_data_link_order;
65 	link_order->offset = statement->data_statement.output_offset;
66 	link_order->u.data.contents = (bfd_byte *) xmalloc (QUAD_SIZE);
67 
68 	value = statement->data_statement.value;
69 
70 	/* If the endianness of the output BFD is not known, then we
71 	   base the endianness of the data on the first input file.
72 	   By convention, the bfd_put routines for an unknown
73 	   endianness are big endian, so we must swap here if the
74 	   input file is little endian.  */
75 	if (bfd_big_endian (link_info.output_bfd))
76 	  big_endian = TRUE;
77 	else if (bfd_little_endian (link_info.output_bfd))
78 	  big_endian = FALSE;
79 	else
80 	  {
81 	    bfd_boolean swap;
82 
83 	    swap = FALSE;
84 	    if (command_line.endian == ENDIAN_BIG)
85 	      big_endian = TRUE;
86 	    else if (command_line.endian == ENDIAN_LITTLE)
87 	      {
88 		big_endian = FALSE;
89 		swap = TRUE;
90 	      }
91 	    else if (command_line.endian == ENDIAN_UNSET)
92 	      {
93 		big_endian = TRUE;
94 		{
95 		  LANG_FOR_EACH_INPUT_STATEMENT (s)
96 		    {
97 		      if (s->the_bfd != NULL)
98 			{
99 			  if (bfd_little_endian (s->the_bfd))
100 			    {
101 			      big_endian = FALSE;
102 			      swap = TRUE;
103 			    }
104 			  break;
105 			}
106 		    }
107 		}
108 	      }
109 
110 	    if (swap)
111 	      {
112 		bfd_byte buffer[8];
113 
114 		switch (statement->data_statement.type)
115 		  {
116 		  case QUAD:
117 		  case SQUAD:
118 		    if (sizeof (bfd_vma) >= QUAD_SIZE)
119 		      {
120 			bfd_putl64 (value, buffer);
121 			value = bfd_getb64 (buffer);
122 			break;
123 		      }
124 		    /* Fall through.  */
125 		  case LONG:
126 		    bfd_putl32 (value, buffer);
127 		    value = bfd_getb32 (buffer);
128 		    break;
129 		  case SHORT:
130 		    bfd_putl16 (value, buffer);
131 		    value = bfd_getb16 (buffer);
132 		    break;
133 		  case BYTE:
134 		    break;
135 		  default:
136 		    abort ();
137 		  }
138 	      }
139 	  }
140 
141 	ASSERT (output_section->owner == link_info.output_bfd);
142 	switch (statement->data_statement.type)
143 	  {
144 	  case QUAD:
145 	  case SQUAD:
146 	    if (sizeof (bfd_vma) >= QUAD_SIZE)
147 	      bfd_put_64 (link_info.output_bfd, value,
148 			  link_order->u.data.contents);
149 	    else
150 	      {
151 		bfd_vma high;
152 
153 		if (statement->data_statement.type == QUAD)
154 		  high = 0;
155 		else if ((value & 0x80000000) == 0)
156 		  high = 0;
157 		else
158 		  high = (bfd_vma) -1;
159 		bfd_put_32 (link_info.output_bfd, high,
160 			    (link_order->u.data.contents
161 			     + (big_endian ? 0 : 4)));
162 		bfd_put_32 (link_info.output_bfd, value,
163 			    (link_order->u.data.contents
164 			     + (big_endian ? 4 : 0)));
165 	      }
166 	    link_order->size = QUAD_SIZE;
167 	    break;
168 	  case LONG:
169 	    bfd_put_32 (link_info.output_bfd, value,
170 			link_order->u.data.contents);
171 	    link_order->size = LONG_SIZE;
172 	    break;
173 	  case SHORT:
174 	    bfd_put_16 (link_info.output_bfd, value,
175 			link_order->u.data.contents);
176 	    link_order->size = SHORT_SIZE;
177 	    break;
178 	  case BYTE:
179 	    bfd_put_8 (link_info.output_bfd, value,
180 		       link_order->u.data.contents);
181 	    link_order->size = BYTE_SIZE;
182 	    break;
183 	  default:
184 	    abort ();
185 	  }
186 	link_order->u.data.size = link_order->size;
187       }
188       break;
189 
190     case lang_reloc_statement_enum:
191       {
192 	lang_reloc_statement_type *rs;
193 	asection *output_section;
194 	struct bfd_link_order *link_order;
195 
196 	rs = &statement->reloc_statement;
197 
198 	output_section = rs->output_section;
199 	ASSERT (output_section->owner == link_info.output_bfd);
200 
201 	if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
202 	      || ((output_section->flags & SEC_LOAD) != 0
203 		  && (output_section->flags & SEC_THREAD_LOCAL))))
204 	  break;
205 
206 	link_order = bfd_new_link_order (link_info.output_bfd, output_section);
207 	if (link_order == NULL)
208 	  einfo (_("%P%F: bfd_new_link_order failed\n"));
209 
210 	link_order->offset = rs->output_offset;
211 	link_order->size = bfd_get_reloc_size (rs->howto);
212 
213 	link_order->u.reloc.p = (struct bfd_link_order_reloc *)
214             xmalloc (sizeof (struct bfd_link_order_reloc));
215 
216 	link_order->u.reloc.p->reloc = rs->reloc;
217 	link_order->u.reloc.p->addend = rs->addend_value;
218 
219 	if (rs->name == NULL)
220 	  {
221 	    link_order->type = bfd_section_reloc_link_order;
222 	    if (rs->section->owner == link_info.output_bfd)
223 	      link_order->u.reloc.p->u.section = rs->section;
224 	    else
225 	      {
226 		link_order->u.reloc.p->u.section = rs->section->output_section;
227 		link_order->u.reloc.p->addend += rs->section->output_offset;
228 	      }
229 	  }
230 	else
231 	  {
232 	    link_order->type = bfd_symbol_reloc_link_order;
233 	    link_order->u.reloc.p->u.name = rs->name;
234 	  }
235       }
236       break;
237 
238     case lang_input_section_enum:
239       {
240 	/* Create a new link_order in the output section with this
241 	   attached */
242 	asection *i = statement->input_section.section;
243 
244 	if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
245 	    && (i->flags & SEC_EXCLUDE) == 0)
246 	  {
247 	    asection *output_section = i->output_section;
248 	    struct bfd_link_order *link_order;
249 
250 	    ASSERT (output_section->owner == link_info.output_bfd);
251 
252 	    if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
253 		  || ((output_section->flags & SEC_LOAD) != 0
254 		      && (output_section->flags & SEC_THREAD_LOCAL))))
255 	      break;
256 
257 	    link_order = bfd_new_link_order (link_info.output_bfd,
258 					     output_section);
259 
260 	    if ((i->flags & SEC_NEVER_LOAD) != 0
261 		&& (i->flags & SEC_DEBUGGING) == 0)
262 	      {
263 		/* We've got a never load section inside one which is
264 		   going to be output, we'll change it into a fill.  */
265 		link_order->type = bfd_data_link_order;
266 		link_order->u.data.contents = (unsigned char *) "";
267 		link_order->u.data.size = 1;
268 	      }
269 	    else
270 	      {
271 		link_order->type = bfd_indirect_link_order;
272 		link_order->u.indirect.section = i;
273 		ASSERT (i->output_section == output_section);
274 	      }
275 	    link_order->size = i->size;
276 	    link_order->offset = i->output_offset;
277 	  }
278       }
279       break;
280 
281     case lang_padding_statement_enum:
282       /* Make a new link_order with the right filler */
283       {
284 	asection *output_section;
285 	struct bfd_link_order *link_order;
286 
287 	output_section = statement->padding_statement.output_section;
288 	ASSERT (statement->padding_statement.output_section->owner
289 		== link_info.output_bfd);
290 
291 	if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
292 	      || ((output_section->flags & SEC_LOAD) != 0
293 		  && (output_section->flags & SEC_THREAD_LOCAL))))
294 	  break;
295 
296 	link_order = bfd_new_link_order (link_info.output_bfd,
297 					 output_section);
298 	link_order->type = bfd_data_link_order;
299 	link_order->size = statement->padding_statement.size;
300 	link_order->offset = statement->padding_statement.output_offset;
301 	link_order->u.data.contents = statement->padding_statement.fill->data;
302 	link_order->u.data.size = statement->padding_statement.fill->size;
303       }
304       break;
305 
306     default:
307       /* All the other ones fall through */
308       break;
309     }
310 }
311 
312 /* Return true if NAME is the name of an unsplittable section. These
313    are the stabs strings, dwarf strings.  */
314 
315 static bfd_boolean
316 unsplittable_name (const char *name)
317 {
318   if (CONST_STRNEQ (name, ".stab"))
319     {
320       /* There are several stab like string sections. We pattern match on
321 	 ".stab...str"  */
322       unsigned len = strlen (name);
323       if (strcmp (&name[len-3], "str") == 0)
324 	return TRUE;
325     }
326   else if (strcmp (name, "$GDB_STRINGS$") == 0)
327     return TRUE;
328   return FALSE;
329 }
330 
331 /* Wander around the input sections, make sure that
332    we'll never try and create an output section with more relocs
333    than will fit.. Do this by always assuming the worst case, and
334    creating new output sections with all the right bits.  */
335 #define TESTIT 1
336 static asection *
337 clone_section (bfd *abfd, asection *s, const char *name, int *count)
338 {
339   char *tname;
340   char *sname;
341   unsigned int len;
342   asection *n;
343   struct bfd_link_hash_entry *h;
344 
345   /* Invent a section name from the section name and a dotted numeric
346      suffix.   */
347   len = strlen (name);
348   tname = (char *) xmalloc (len + 1);
349   memcpy (tname, name, len + 1);
350   /* Remove a dotted number suffix, from a previous split link. */
351   while (len && ISDIGIT (tname[len-1]))
352     len--;
353   if (len > 1 && tname[len-1] == '.')
354     /* It was a dotted number. */
355     tname[len-1] = 0;
356 
357   /* We want to use the whole of the original section name for the
358      split name, but coff can be restricted to 8 character names.  */
359   if (bfd_family_coff (abfd) && strlen (tname) > 5)
360     {
361       /* Some section names cannot be truncated, as the name is
362 	 used to locate some other section.  */
363       if (CONST_STRNEQ (name, ".stab")
364 	  || strcmp (name, "$GDB_SYMBOLS$") == 0)
365 	{
366 	  einfo (_ ("%F%P: cannot create split section name for %s\n"), name);
367 	  /* Silence gcc warnings.  einfo exits, so we never reach here.  */
368 	  return NULL;
369 	}
370       tname[5] = 0;
371     }
372 
373   if ((sname = bfd_get_unique_section_name (abfd, tname, count)) == NULL
374       || (n = bfd_make_section_anyway (abfd, sname)) == NULL
375       || (h = bfd_link_hash_lookup (link_info.hash,
376 				    sname, TRUE, TRUE, FALSE)) == NULL)
377     {
378       einfo (_("%F%P: clone section failed: %E\n"));
379       /* Silence gcc warnings.  einfo exits, so we never reach here.  */
380       return NULL;
381     }
382   free (tname);
383 
384   /* Set up section symbol.  */
385   h->type = bfd_link_hash_defined;
386   h->u.def.value = 0;
387   h->u.def.section = n;
388 
389   n->flags = s->flags;
390   n->vma = s->vma;
391   n->user_set_vma = s->user_set_vma;
392   n->lma = s->lma;
393   n->size = 0;
394   n->output_offset = s->output_offset;
395   n->output_section = n;
396   n->orelocation = 0;
397   n->reloc_count = 0;
398   n->alignment_power = s->alignment_power;
399 
400   bfd_copy_private_section_data (abfd, s, abfd, n);
401 
402   return n;
403 }
404 
405 #if TESTING
406 static void
407 ds (asection *s)
408 {
409   struct bfd_link_order *l = s->map_head.link_order;
410   printf ("vma %x size %x\n", s->vma, s->size);
411   while (l)
412     {
413       if (l->type == bfd_indirect_link_order)
414 	{
415 	  printf ("%8x %s\n", l->offset, l->u.indirect.section->owner->filename);
416 	}
417       else
418 	{
419 	  printf (_("%8x something else\n"), l->offset);
420 	}
421       l = l->next;
422     }
423   printf ("\n");
424 }
425 
426 dump (char *s, asection *a1, asection *a2)
427 {
428   printf ("%s\n", s);
429   ds (a1);
430   ds (a2);
431 }
432 
433 static void
434 sanity_check (bfd *abfd)
435 {
436   asection *s;
437   for (s = abfd->sections; s; s = s->next)
438     {
439       struct bfd_link_order *p;
440       bfd_vma prev = 0;
441       for (p = s->map_head.link_order; p; p = p->next)
442 	{
443 	  if (p->offset > 100000)
444 	    abort ();
445 	  if (p->offset < prev)
446 	    abort ();
447 	  prev = p->offset;
448 	}
449     }
450 }
451 #else
452 #define sanity_check(a)
453 #define dump(a, b, c)
454 #endif
455 
456 static void
457 split_sections (bfd *abfd, struct bfd_link_info *info)
458 {
459   asection *original_sec;
460   int nsecs = abfd->section_count;
461   sanity_check (abfd);
462   /* Look through all the original sections.  */
463   for (original_sec = abfd->sections;
464        original_sec && nsecs;
465        original_sec = original_sec->next, nsecs--)
466     {
467       int count = 0;
468       unsigned int lines = 0;
469       unsigned int relocs = 0;
470       bfd_size_type sec_size = 0;
471       struct bfd_link_order *l;
472       struct bfd_link_order *p;
473       bfd_vma vma = original_sec->vma;
474       asection *cursor = original_sec;
475 
476       /* Count up the relocations and line entries to see if anything
477 	 would be too big to fit.  Accumulate section size too.  */
478       for (l = NULL, p = cursor->map_head.link_order; p != NULL; p = l->next)
479 	{
480 	  unsigned int thislines = 0;
481 	  unsigned int thisrelocs = 0;
482 	  bfd_size_type thissize = 0;
483 	  if (p->type == bfd_indirect_link_order)
484 	    {
485 	      asection *sec;
486 
487 	      sec = p->u.indirect.section;
488 
489 	      if (info->strip == strip_none
490 		  || info->strip == strip_some)
491 		thislines = sec->lineno_count;
492 
493 	      if (info->relocatable)
494 		thisrelocs = sec->reloc_count;
495 
496 	      thissize = sec->size;
497 
498 	    }
499 	  else if (info->relocatable
500 		   && (p->type == bfd_section_reloc_link_order
501 		       || p->type == bfd_symbol_reloc_link_order))
502 	    thisrelocs++;
503 
504 	  if (l != NULL
505 	      && (thisrelocs + relocs >= config.split_by_reloc
506 		  || thislines + lines >= config.split_by_reloc
507 		  || (thissize + sec_size >= config.split_by_file))
508 	      && !unsplittable_name (cursor->name))
509 	    {
510 	      /* Create a new section and put this link order and the
511 		 following link orders into it.  */
512 	      bfd_vma shift_offset;
513 	      asection *n;
514 
515 	      n = clone_section (abfd, cursor, original_sec->name, &count);
516 
517 	      /* Attach the link orders to the new section and snip
518 		 them off from the old section.  */
519 	      n->map_head.link_order = p;
520 	      n->map_tail.link_order = cursor->map_tail.link_order;
521 	      cursor->map_tail.link_order = l;
522 	      l->next = NULL;
523 	      l = p;
524 
525 	      /* Change the size of the original section and
526 		 update the vma of the new one.  */
527 
528 	      dump ("before snip", cursor, n);
529 
530 	      shift_offset = p->offset;
531 	      n->size = cursor->size - shift_offset;
532 	      cursor->size = shift_offset;
533 
534 	      vma += shift_offset;
535 	      n->lma = n->vma = vma;
536 
537 	      /* Run down the chain and change the output section to
538 		 the right one, update the offsets too.  */
539 	      do
540 		{
541 		  p->offset -= shift_offset;
542 		  if (p->type == bfd_indirect_link_order)
543 		    {
544 		      p->u.indirect.section->output_section = n;
545 		      p->u.indirect.section->output_offset = p->offset;
546 		    }
547 		  p = p->next;
548 		}
549 	      while (p);
550 
551 	      dump ("after snip", cursor, n);
552 	      cursor = n;
553 	      relocs = thisrelocs;
554 	      lines = thislines;
555 	      sec_size = thissize;
556 	    }
557 	  else
558 	    {
559 	      l = p;
560 	      relocs += thisrelocs;
561 	      lines += thislines;
562 	      sec_size += thissize;
563 	    }
564 	}
565     }
566   sanity_check (abfd);
567 }
568 
569 /* Call BFD to write out the linked file.  */
570 
571 void
572 ldwrite (void)
573 {
574   /* Reset error indicator, which can typically something like invalid
575      format from opening up the .o files.  */
576   bfd_set_error (bfd_error_no_error);
577   lang_for_each_statement (build_link_order);
578 
579   if (config.split_by_reloc != (unsigned) -1
580       || config.split_by_file != (bfd_size_type) -1)
581     split_sections (link_info.output_bfd, &link_info);
582   if (!bfd_final_link (link_info.output_bfd, &link_info))
583     {
584       /* If there was an error recorded, print it out.  Otherwise assume
585 	 an appropriate error message like unknown symbol was printed
586 	 out.  */
587 
588       if (bfd_get_error () != bfd_error_no_error)
589 	einfo (_("%F%P: final link failed: %E\n"));
590       else
591 	xexit (1);
592     }
593 }
594