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