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