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