tizen 2.4 release
[external/binutils.git] / ld / ldwrite.c
1 /* ldwrite.c -- write out the linked file
2    Copyright (C) 1991-2014 Free Software Foundation, Inc.
3    Written by Steve Chamberlain sac@cygnus.com
4
5    This file is part of the GNU Binutils.
6
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.
11
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.
16
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.  */
21
22 #include "sysdep.h"
23 #include "bfd.h"
24 #include "bfdlink.h"
25 #include "libiberty.h"
26 #include "safe-ctype.h"
27
28 #include "ld.h"
29 #include "ldexp.h"
30 #include "ldlang.h"
31 #include "ldwrite.h"
32 #include "ldmisc.h"
33 #include <ldgram.h>
34 #include "ldmain.h"
35
36 /* Build link_order structures for the BFD linker.  */
37
38 static void
39 build_link_order (lang_statement_union_type *statement)
40 {
41   switch (statement->header.type)
42     {
43     case lang_data_statement_enum:
44       {
45         asection *output_section;
46         struct bfd_link_order *link_order;
47         bfd_vma value;
48         bfd_boolean big_endian = FALSE;
49
50         output_section = statement->data_statement.output_section;
51         ASSERT (output_section->owner == link_info.output_bfd);
52
53         if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
54               || ((output_section->flags & SEC_LOAD) != 0
55                   && (output_section->flags & SEC_THREAD_LOCAL))))
56           break;
57
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"));
61
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);
65
66         value = statement->data_statement.value;
67
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))
74           big_endian = TRUE;
75         else if (bfd_little_endian (link_info.output_bfd))
76           big_endian = FALSE;
77         else
78           {
79             bfd_boolean swap;
80
81             swap = FALSE;
82             if (command_line.endian == ENDIAN_BIG)
83               big_endian = TRUE;
84             else if (command_line.endian == ENDIAN_LITTLE)
85               {
86                 big_endian = FALSE;
87                 swap = TRUE;
88               }
89             else if (command_line.endian == ENDIAN_UNSET)
90               {
91                 big_endian = TRUE;
92                 {
93                   LANG_FOR_EACH_INPUT_STATEMENT (s)
94                     {
95                       if (s->the_bfd != NULL)
96                         {
97                           if (bfd_little_endian (s->the_bfd))
98                             {
99                               big_endian = FALSE;
100                               swap = TRUE;
101                             }
102                           break;
103                         }
104                     }
105                 }
106               }
107
108             if (swap)
109               {
110                 bfd_byte buffer[8];
111
112                 switch (statement->data_statement.type)
113                   {
114                   case QUAD:
115                   case SQUAD:
116                     if (sizeof (bfd_vma) >= QUAD_SIZE)
117                       {
118                         bfd_putl64 (value, buffer);
119                         value = bfd_getb64 (buffer);
120                         break;
121                       }
122                     /* Fall through.  */
123                   case LONG:
124                     bfd_putl32 (value, buffer);
125                     value = bfd_getb32 (buffer);
126                     break;
127                   case SHORT:
128                     bfd_putl16 (value, buffer);
129                     value = bfd_getb16 (buffer);
130                     break;
131                   case BYTE:
132                     break;
133                   default:
134                     abort ();
135                   }
136               }
137           }
138
139         ASSERT (output_section->owner == link_info.output_bfd);
140         switch (statement->data_statement.type)
141           {
142           case QUAD:
143           case SQUAD:
144             if (sizeof (bfd_vma) >= QUAD_SIZE)
145               bfd_put_64 (link_info.output_bfd, value,
146                           link_order->u.data.contents);
147             else
148               {
149                 bfd_vma high;
150
151                 if (statement->data_statement.type == QUAD)
152                   high = 0;
153                 else if ((value & 0x80000000) == 0)
154                   high = 0;
155                 else
156                   high = (bfd_vma) -1;
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)));
163               }
164             link_order->size = QUAD_SIZE;
165             break;
166           case LONG:
167             bfd_put_32 (link_info.output_bfd, value,
168                         link_order->u.data.contents);
169             link_order->size = LONG_SIZE;
170             break;
171           case SHORT:
172             bfd_put_16 (link_info.output_bfd, value,
173                         link_order->u.data.contents);
174             link_order->size = SHORT_SIZE;
175             break;
176           case BYTE:
177             bfd_put_8 (link_info.output_bfd, value,
178                        link_order->u.data.contents);
179             link_order->size = BYTE_SIZE;
180             break;
181           default:
182             abort ();
183           }
184         link_order->u.data.size = link_order->size;
185       }
186       break;
187
188     case lang_reloc_statement_enum:
189       {
190         lang_reloc_statement_type *rs;
191         asection *output_section;
192         struct bfd_link_order *link_order;
193
194         rs = &statement->reloc_statement;
195
196         output_section = rs->output_section;
197         ASSERT (output_section->owner == link_info.output_bfd);
198
199         if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
200               || ((output_section->flags & SEC_LOAD) != 0
201                   && (output_section->flags & SEC_THREAD_LOCAL))))
202           break;
203
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"));
207
208         link_order->offset = rs->output_offset;
209         link_order->size = bfd_get_reloc_size (rs->howto);
210
211         link_order->u.reloc.p = (struct bfd_link_order_reloc *)
212             xmalloc (sizeof (struct bfd_link_order_reloc));
213
214         link_order->u.reloc.p->reloc = rs->reloc;
215         link_order->u.reloc.p->addend = rs->addend_value;
216
217         if (rs->name == NULL)
218           {
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;
222             else
223               {
224                 link_order->u.reloc.p->u.section = rs->section->output_section;
225                 link_order->u.reloc.p->addend += rs->section->output_offset;
226               }
227           }
228         else
229           {
230             link_order->type = bfd_symbol_reloc_link_order;
231             link_order->u.reloc.p->u.name = rs->name;
232           }
233       }
234       break;
235
236     case lang_input_section_enum:
237       {
238         /* Create a new link_order in the output section with this
239            attached */
240         asection *i = statement->input_section.section;
241
242         if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
243             && (i->flags & SEC_EXCLUDE) == 0)
244           {
245             asection *output_section = i->output_section;
246             struct bfd_link_order *link_order;
247
248             ASSERT (output_section->owner == link_info.output_bfd);
249
250             if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
251                   || ((output_section->flags & SEC_LOAD) != 0
252                       && (output_section->flags & SEC_THREAD_LOCAL))))
253               break;
254
255             link_order = bfd_new_link_order (link_info.output_bfd,
256                                              output_section);
257
258             if ((i->flags & SEC_NEVER_LOAD) != 0
259                 && (i->flags & SEC_DEBUGGING) == 0)
260               {
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;
266               }
267             else
268               {
269                 link_order->type = bfd_indirect_link_order;
270                 link_order->u.indirect.section = i;
271                 ASSERT (i->output_section == output_section);
272               }
273             link_order->size = i->size;
274             link_order->offset = i->output_offset;
275           }
276       }
277       break;
278
279     case lang_padding_statement_enum:
280       /* Make a new link_order with the right filler */
281       {
282         asection *output_section;
283         struct bfd_link_order *link_order;
284
285         output_section = statement->padding_statement.output_section;
286         ASSERT (statement->padding_statement.output_section->owner
287                 == link_info.output_bfd);
288
289         if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
290               || ((output_section->flags & SEC_LOAD) != 0
291                   && (output_section->flags & SEC_THREAD_LOCAL))))
292           break;
293
294         link_order = bfd_new_link_order (link_info.output_bfd,
295                                          output_section);
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;
301       }
302       break;
303
304     default:
305       /* All the other ones fall through */
306       break;
307     }
308 }
309
310 /* Return true if NAME is the name of an unsplittable section. These
311    are the stabs strings, dwarf strings.  */
312
313 static bfd_boolean
314 unsplittable_name (const char *name)
315 {
316   if (CONST_STRNEQ (name, ".stab"))
317     {
318       /* There are several stab like string sections. We pattern match on
319          ".stab...str"  */
320       unsigned len = strlen (name);
321       if (strcmp (&name[len-3], "str") == 0)
322         return TRUE;
323     }
324   else if (strcmp (name, "$GDB_STRINGS$") == 0)
325     return TRUE;
326   return FALSE;
327 }
328
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.  */
333 #define TESTIT 1
334 static asection *
335 clone_section (bfd *abfd, asection *s, const char *name, int *count)
336 {
337   char *tname;
338   char *sname;
339   unsigned int len;
340   asection *n;
341   struct bfd_link_hash_entry *h;
342
343   /* Invent a section name from the section name and a dotted numeric
344      suffix.   */
345   len = strlen (name);
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]))
350     len--;
351   if (len > 1 && tname[len-1] == '.')
352     /* It was a dotted number. */
353     tname[len-1] = 0;
354
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)
358     {
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)
363         {
364           einfo (_ ("%F%P: cannot create split section name for %s\n"), name);
365           /* Silence gcc warnings.  einfo exits, so we never reach here.  */
366           return NULL;
367         }
368       tname[5] = 0;
369     }
370
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)
375     {
376       einfo (_("%F%P: clone section failed: %E\n"));
377       /* Silence gcc warnings.  einfo exits, so we never reach here.  */
378       return NULL;
379     }
380   free (tname);
381
382   /* Set up section symbol.  */
383   h->type = bfd_link_hash_defined;
384   h->u.def.value = 0;
385   h->u.def.section = n;
386
387   n->flags = s->flags;
388   n->vma = s->vma;
389   n->user_set_vma = s->user_set_vma;
390   n->lma = s->lma;
391   n->size = 0;
392   n->output_offset = s->output_offset;
393   n->output_section = n;
394   n->orelocation = 0;
395   n->reloc_count = 0;
396   n->alignment_power = s->alignment_power;
397
398   bfd_copy_private_section_data (abfd, s, abfd, n);
399
400   return n;
401 }
402
403 #if TESTING
404 static void
405 ds (asection *s)
406 {
407   struct bfd_link_order *l = s->map_head.link_order;
408   printf ("vma %x size %x\n", s->vma, s->size);
409   while (l)
410     {
411       if (l->type == bfd_indirect_link_order)
412         {
413           printf ("%8x %s\n", l->offset, l->u.indirect.section->owner->filename);
414         }
415       else
416         {
417           printf (_("%8x something else\n"), l->offset);
418         }
419       l = l->next;
420     }
421   printf ("\n");
422 }
423
424 dump (char *s, asection *a1, asection *a2)
425 {
426   printf ("%s\n", s);
427   ds (a1);
428   ds (a2);
429 }
430
431 static void
432 sanity_check (bfd *abfd)
433 {
434   asection *s;
435   for (s = abfd->sections; s; s = s->next)
436     {
437       struct bfd_link_order *p;
438       bfd_vma prev = 0;
439       for (p = s->map_head.link_order; p; p = p->next)
440         {
441           if (p->offset > 100000)
442             abort ();
443           if (p->offset < prev)
444             abort ();
445           prev = p->offset;
446         }
447     }
448 }
449 #else
450 #define sanity_check(a)
451 #define dump(a, b, c)
452 #endif
453
454 static void
455 split_sections (bfd *abfd, struct bfd_link_info *info)
456 {
457   asection *original_sec;
458   int nsecs = abfd->section_count;
459   sanity_check (abfd);
460   /* Look through all the original sections.  */
461   for (original_sec = abfd->sections;
462        original_sec && nsecs;
463        original_sec = original_sec->next, nsecs--)
464     {
465       int count = 0;
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;
473
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)
477         {
478           unsigned int thislines = 0;
479           unsigned int thisrelocs = 0;
480           bfd_size_type thissize = 0;
481           if (p->type == bfd_indirect_link_order)
482             {
483               asection *sec;
484
485               sec = p->u.indirect.section;
486
487               if (info->strip == strip_none
488                   || info->strip == strip_some)
489                 thislines = sec->lineno_count;
490
491               if (info->relocatable)
492                 thisrelocs = sec->reloc_count;
493
494               thissize = sec->size;
495
496             }
497           else if (info->relocatable
498                    && (p->type == bfd_section_reloc_link_order
499                        || p->type == bfd_symbol_reloc_link_order))
500             thisrelocs++;
501
502           if (l != NULL
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))
507             {
508               /* Create a new section and put this link order and the
509                  following link orders into it.  */
510               bfd_vma shift_offset;
511               asection *n;
512
513               n = clone_section (abfd, cursor, original_sec->name, &count);
514
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;
520               l->next = NULL;
521               l = p;
522
523               /* Change the size of the original section and
524                  update the vma of the new one.  */
525
526               dump ("before snip", cursor, n);
527
528               shift_offset = p->offset;
529               n->size = cursor->size - shift_offset;
530               cursor->size = shift_offset;
531
532               vma += shift_offset;
533               n->lma = n->vma = vma;
534
535               /* Run down the chain and change the output section to
536                  the right one, update the offsets too.  */
537               do
538                 {
539                   p->offset -= shift_offset;
540                   if (p->type == bfd_indirect_link_order)
541                     {
542                       p->u.indirect.section->output_section = n;
543                       p->u.indirect.section->output_offset = p->offset;
544                     }
545                   p = p->next;
546                 }
547               while (p);
548
549               dump ("after snip", cursor, n);
550               cursor = n;
551               relocs = thisrelocs;
552               lines = thislines;
553               sec_size = thissize;
554             }
555           else
556             {
557               l = p;
558               relocs += thisrelocs;
559               lines += thislines;
560               sec_size += thissize;
561             }
562         }
563     }
564   sanity_check (abfd);
565 }
566
567 /* Call BFD to write out the linked file.  */
568
569 void
570 ldwrite (void)
571 {
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);
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 }