xref: /netbsd-src/external/gpl3/binutils/dist/ld/ldwrite.c (revision a5847cc334d9a7029f6352b847e9e8d71a0f9e0c)
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
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       }
187       break;
188 
189     case lang_reloc_statement_enum:
190       {
191 	lang_reloc_statement_type *rs;
192 	asection *output_section;
193 	struct bfd_link_order *link_order;
194 
195 	rs = &statement->reloc_statement;
196 
197 	output_section = rs->output_section;
198 	ASSERT (output_section->owner == link_info.output_bfd);
199 
200 	if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
201 	      || ((output_section->flags & SEC_LOAD) != 0
202 		  && (output_section->flags & SEC_THREAD_LOCAL))))
203 	  break;
204 
205 	link_order = bfd_new_link_order (link_info.output_bfd, output_section);
206 	if (link_order == NULL)
207 	  einfo (_("%P%F: bfd_new_link_order failed\n"));
208 
209 	link_order->offset = rs->output_offset;
210 	link_order->size = bfd_get_reloc_size (rs->howto);
211 
212 	link_order->u.reloc.p = (struct bfd_link_order_reloc *)
213             xmalloc (sizeof (struct bfd_link_order_reloc));
214 
215 	link_order->u.reloc.p->reloc = rs->reloc;
216 	link_order->u.reloc.p->addend = rs->addend_value;
217 
218 	if (rs->name == NULL)
219 	  {
220 	    link_order->type = bfd_section_reloc_link_order;
221 	    if (rs->section->owner == link_info.output_bfd)
222 	      link_order->u.reloc.p->u.section = rs->section;
223 	    else
224 	      {
225 		link_order->u.reloc.p->u.section = rs->section->output_section;
226 		link_order->u.reloc.p->addend += rs->section->output_offset;
227 	      }
228 	  }
229 	else
230 	  {
231 	    link_order->type = bfd_symbol_reloc_link_order;
232 	    link_order->u.reloc.p->u.name = rs->name;
233 	  }
234       }
235       break;
236 
237     case lang_input_section_enum:
238       {
239 	/* Create a new link_order in the output section with this
240 	   attached */
241 	asection *i = statement->input_section.section;
242 
243 	if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
244 	    && (i->flags & SEC_EXCLUDE) == 0)
245 	  {
246 	    asection *output_section = i->output_section;
247 	    struct bfd_link_order *link_order;
248 
249 	    ASSERT (output_section->owner == link_info.output_bfd);
250 
251 	    if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
252 		  || ((output_section->flags & SEC_LOAD) != 0
253 		      && (output_section->flags & SEC_THREAD_LOCAL))))
254 	      break;
255 
256 	    link_order = bfd_new_link_order (link_info.output_bfd,
257 					     output_section);
258 
259 	    if ((i->flags & SEC_NEVER_LOAD) != 0
260 		&& (i->flags & SEC_DEBUGGING) == 0)
261 	      {
262 		/* We've got a never load section inside one which is
263 		   going to be output, we'll change it into a fill.  */
264 		link_order->type = bfd_data_link_order;
265 		link_order->u.data.contents = (unsigned char *) "";
266 		link_order->u.data.size = 1;
267 	      }
268 	    else
269 	      {
270 		link_order->type = bfd_indirect_link_order;
271 		link_order->u.indirect.section = i;
272 		ASSERT (i->output_section == output_section);
273 	      }
274 	    link_order->size = i->size;
275 	    link_order->offset = i->output_offset;
276 	  }
277       }
278       break;
279 
280     case lang_padding_statement_enum:
281       /* Make a new link_order with the right filler */
282       {
283 	asection *output_section;
284 	struct bfd_link_order *link_order;
285 
286 	output_section = statement->padding_statement.output_section;
287 	ASSERT (statement->padding_statement.output_section->owner
288 		== link_info.output_bfd);
289 
290 	if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
291 	      || ((output_section->flags & SEC_LOAD) != 0
292 		  && (output_section->flags & SEC_THREAD_LOCAL))))
293 	  break;
294 
295 	link_order = bfd_new_link_order (link_info.output_bfd,
296 					 output_section);
297 	link_order->type = bfd_data_link_order;
298 	link_order->size = statement->padding_statement.size;
299 	link_order->offset = statement->padding_statement.output_offset;
300 	link_order->u.data.contents = statement->padding_statement.fill->data;
301 	link_order->u.data.size = statement->padding_statement.fill->size;
302       }
303       break;
304 
305     default:
306       /* All the other ones fall through */
307       break;
308     }
309 }
310 
311 /* Return true if NAME is the name of an unsplittable section. These
312    are the stabs strings, dwarf strings.  */
313 
314 static bfd_boolean
315 unsplittable_name (const char *name)
316 {
317   if (CONST_STRNEQ (name, ".stab"))
318     {
319       /* There are several stab like string sections. We pattern match on
320 	 ".stab...str"  */
321       unsigned len = strlen (name);
322       if (strcmp (&name[len-3], "str") == 0)
323 	return TRUE;
324     }
325   else if (strcmp (name, "$GDB_STRINGS$") == 0)
326     return TRUE;
327   return FALSE;
328 }
329 
330 /* Wander around the input sections, make sure that
331    we'll never try and create an output section with more relocs
332    than will fit.. Do this by always assuming the worst case, and
333    creating new output sections with all the right bits.  */
334 #define TESTIT 1
335 static asection *
336 clone_section (bfd *abfd, asection *s, const char *name, int *count)
337 {
338   char *tname;
339   char *sname;
340   unsigned int len;
341   asection *n;
342   struct bfd_link_hash_entry *h;
343 
344   /* Invent a section name from the section name and a dotted numeric
345      suffix.   */
346   len = strlen (name);
347   tname = (char *) xmalloc (len + 1);
348   memcpy (tname, name, len + 1);
349   /* Remove a dotted number suffix, from a previous split link. */
350   while (len && ISDIGIT (tname[len-1]))
351     len--;
352   if (len > 1 && tname[len-1] == '.')
353     /* It was a dotted number. */
354     tname[len-1] = 0;
355 
356   /* We want to use the whole of the original section name for the
357      split name, but coff can be restricted to 8 character names.  */
358   if (bfd_family_coff (abfd) && strlen (tname) > 5)
359     {
360       /* Some section names cannot be truncated, as the name is
361 	 used to locate some other section.  */
362       if (CONST_STRNEQ (name, ".stab")
363 	  || strcmp (name, "$GDB_SYMBOLS$") == 0)
364 	{
365 	  einfo (_ ("%F%P: cannot create split section name for %s\n"), name);
366 	  /* Silence gcc warnings.  einfo exits, so we never reach here.  */
367 	  return NULL;
368 	}
369       tname[5] = 0;
370     }
371 
372   if ((sname = bfd_get_unique_section_name (abfd, tname, count)) == NULL
373       || (n = bfd_make_section_anyway (abfd, sname)) == NULL
374       || (h = bfd_link_hash_lookup (link_info.hash,
375 				    sname, TRUE, TRUE, FALSE)) == NULL)
376     {
377       einfo (_("%F%P: clone section failed: %E\n"));
378       /* Silence gcc warnings.  einfo exits, so we never reach here.  */
379       return NULL;
380     }
381   free (tname);
382 
383   /* Set up section symbol.  */
384   h->type = bfd_link_hash_defined;
385   h->u.def.value = 0;
386   h->u.def.section = n;
387 
388   n->flags = s->flags;
389   n->vma = s->vma;
390   n->user_set_vma = s->user_set_vma;
391   n->lma = s->lma;
392   n->size = 0;
393   n->output_offset = s->output_offset;
394   n->output_section = n;
395   n->orelocation = 0;
396   n->reloc_count = 0;
397   n->alignment_power = s->alignment_power;
398 
399   bfd_copy_private_section_data (abfd, s, abfd, n);
400 
401   return n;
402 }
403 
404 #if TESTING
405 static void
406 ds (asection *s)
407 {
408   struct bfd_link_order *l = s->map_head.link_order;
409   printf ("vma %x size %x\n", s->vma, s->size);
410   while (l)
411     {
412       if (l->type == bfd_indirect_link_order)
413 	{
414 	  printf ("%8x %s\n", l->offset, l->u.indirect.section->owner->filename);
415 	}
416       else
417 	{
418 	  printf (_("%8x something else\n"), l->offset);
419 	}
420       l = l->next;
421     }
422   printf ("\n");
423 }
424 
425 dump (char *s, asection *a1, asection *a2)
426 {
427   printf ("%s\n", s);
428   ds (a1);
429   ds (a2);
430 }
431 
432 static void
433 sanity_check (bfd *abfd)
434 {
435   asection *s;
436   for (s = abfd->sections; s; s = s->next)
437     {
438       struct bfd_link_order *p;
439       bfd_vma prev = 0;
440       for (p = s->map_head.link_order; p; p = p->next)
441 	{
442 	  if (p->offset > 100000)
443 	    abort ();
444 	  if (p->offset < prev)
445 	    abort ();
446 	  prev = p->offset;
447 	}
448     }
449 }
450 #else
451 #define sanity_check(a)
452 #define dump(a, b, c)
453 #endif
454 
455 static void
456 split_sections (bfd *abfd, struct bfd_link_info *info)
457 {
458   asection *original_sec;
459   int nsecs = abfd->section_count;
460   sanity_check (abfd);
461   /* Look through all the original sections.  */
462   for (original_sec = abfd->sections;
463        original_sec && nsecs;
464        original_sec = original_sec->next, nsecs--)
465     {
466       int count = 0;
467       unsigned int lines = 0;
468       unsigned int relocs = 0;
469       bfd_size_type sec_size = 0;
470       struct bfd_link_order *l;
471       struct bfd_link_order *p;
472       bfd_vma vma = original_sec->vma;
473       asection *cursor = original_sec;
474 
475       /* Count up the relocations and line entries to see if anything
476 	 would be too big to fit.  Accumulate section size too.  */
477       for (l = NULL, p = cursor->map_head.link_order; p != NULL; p = l->next)
478 	{
479 	  unsigned int thislines = 0;
480 	  unsigned int thisrelocs = 0;
481 	  bfd_size_type thissize = 0;
482 	  if (p->type == bfd_indirect_link_order)
483 	    {
484 	      asection *sec;
485 
486 	      sec = p->u.indirect.section;
487 
488 	      if (info->strip == strip_none
489 		  || info->strip == strip_some)
490 		thislines = sec->lineno_count;
491 
492 	      if (info->relocatable)
493 		thisrelocs = sec->reloc_count;
494 
495 	      thissize = sec->size;
496 
497 	    }
498 	  else if (info->relocatable
499 		   && (p->type == bfd_section_reloc_link_order
500 		       || p->type == bfd_symbol_reloc_link_order))
501 	    thisrelocs++;
502 
503 	  if (l != NULL
504 	      && (thisrelocs + relocs >= config.split_by_reloc
505 		  || thislines + lines >= config.split_by_reloc
506 		  || (thissize + sec_size >= config.split_by_file))
507 	      && !unsplittable_name (cursor->name))
508 	    {
509 	      /* Create a new section and put this link order and the
510 		 following link orders into it.  */
511 	      bfd_vma shift_offset;
512 	      asection *n;
513 
514 	      n = clone_section (abfd, cursor, original_sec->name, &count);
515 
516 	      /* Attach the link orders to the new section and snip
517 		 them off from the old section.  */
518 	      n->map_head.link_order = p;
519 	      n->map_tail.link_order = cursor->map_tail.link_order;
520 	      cursor->map_tail.link_order = l;
521 	      l->next = NULL;
522 	      l = p;
523 
524 	      /* Change the size of the original section and
525 		 update the vma of the new one.  */
526 
527 	      dump ("before snip", cursor, n);
528 
529 	      shift_offset = p->offset;
530 	      n->size = cursor->size - shift_offset;
531 	      cursor->size = shift_offset;
532 
533 	      vma += shift_offset;
534 	      n->lma = n->vma = vma;
535 
536 	      /* Run down the chain and change the output section to
537 		 the right one, update the offsets too.  */
538 	      do
539 		{
540 		  p->offset -= shift_offset;
541 		  if (p->type == bfd_indirect_link_order)
542 		    {
543 		      p->u.indirect.section->output_section = n;
544 		      p->u.indirect.section->output_offset = p->offset;
545 		    }
546 		  p = p->next;
547 		}
548 	      while (p);
549 
550 	      dump ("after snip", cursor, n);
551 	      cursor = n;
552 	      relocs = thisrelocs;
553 	      lines = thislines;
554 	      sec_size = thissize;
555 	    }
556 	  else
557 	    {
558 	      l = p;
559 	      relocs += thisrelocs;
560 	      lines += thislines;
561 	      sec_size += thissize;
562 	    }
563 	}
564     }
565   sanity_check (abfd);
566 }
567 
568 /* Call BFD to write out the linked file.  */
569 
570 void
571 ldwrite (void)
572 {
573   /* Reset error indicator, which can typically something like invalid
574      format from opening up the .o files.  */
575   bfd_set_error (bfd_error_no_error);
576   lang_for_each_statement (build_link_order);
577 
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))
582     {
583       /* If there was an error recorded, print it out.  Otherwise assume
584 	 an appropriate error message like unknown symbol was printed
585 	 out.  */
586 
587       if (bfd_get_error () != bfd_error_no_error)
588 	einfo (_("%F%P: final link failed: %E\n"));
589       else
590 	xexit (1);
591     }
592 }
593