1 /* ldwrite.c -- write out the linked file
2 Copyright (C) 1991-2024 Free Software Foundation, Inc.
3 Written by Steve Chamberlain sac@cygnus.com
5 This file is part of the GNU Binutils.
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.
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.
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. */
25 #include "libiberty.h"
27 #include "safe-ctype.h"
37 /* Build link_order structures for the BFD linker. */
40 build_link_order (lang_statement_union_type
*statement
)
42 switch (statement
->header
.type
)
44 case lang_data_statement_enum
:
46 asection
*output_section
;
47 struct bfd_link_order
*link_order
;
50 output_section
= statement
->data_statement
.output_section
;
51 ASSERT (output_section
->owner
== link_info
.output_bfd
);
53 if (!((output_section
->flags
& SEC_HAS_CONTENTS
) != 0
54 || ((output_section
->flags
& SEC_LOAD
) != 0
55 && (output_section
->flags
& SEC_THREAD_LOCAL
))))
58 link_order
= bfd_new_link_order (link_info
.output_bfd
, output_section
);
59 if (link_order
== NULL
)
60 einfo (_("%F%P: bfd_new_link_order failed: %E\n"));
62 link_order
->type
= bfd_data_link_order
;
63 link_order
->offset
= statement
->data_statement
.output_offset
;
64 link_order
->u
.data
.contents
= bfd_alloc (link_info
.output_bfd
,
66 if (link_order
->u
.data
.contents
== NULL
)
67 einfo (_("%F%P: bfd_new_link_order failed: %E\n"));
69 value
= statement
->data_statement
.value
;
71 /* By convention, the bfd_put routines for an unknown
72 endianness are big endian, so we must swap here if the
73 input is little endian. */
74 if (!bfd_big_endian (link_info
.output_bfd
)
75 && !bfd_little_endian (link_info
.output_bfd
)
76 && !link_info
.big_endian
)
80 switch (statement
->data_statement
.type
)
84 if (sizeof (bfd_vma
) >= QUAD_SIZE
)
86 bfd_putl64 (value
, buffer
);
87 value
= bfd_getb64 (buffer
);
92 bfd_putl32 (value
, buffer
);
93 value
= bfd_getb32 (buffer
);
96 bfd_putl16 (value
, buffer
);
97 value
= bfd_getb16 (buffer
);
106 ASSERT (output_section
->owner
== link_info
.output_bfd
);
107 switch (statement
->data_statement
.type
)
111 if (sizeof (bfd_vma
) >= QUAD_SIZE
)
112 bfd_put_64 (link_info
.output_bfd
, value
,
113 link_order
->u
.data
.contents
);
118 if (statement
->data_statement
.type
== QUAD
)
120 else if ((value
& 0x80000000) == 0)
124 bfd_put_32 (link_info
.output_bfd
, high
,
125 (link_order
->u
.data
.contents
126 + (link_info
.big_endian
? 0 : 4)));
127 bfd_put_32 (link_info
.output_bfd
, value
,
128 (link_order
->u
.data
.contents
129 + (link_info
.big_endian
? 4 : 0)));
131 link_order
->size
= QUAD_SIZE
;
134 bfd_put_32 (link_info
.output_bfd
, value
,
135 link_order
->u
.data
.contents
);
136 link_order
->size
= LONG_SIZE
;
139 bfd_put_16 (link_info
.output_bfd
, value
,
140 link_order
->u
.data
.contents
);
141 link_order
->size
= SHORT_SIZE
;
144 bfd_put_8 (link_info
.output_bfd
, value
,
145 link_order
->u
.data
.contents
);
146 link_order
->size
= BYTE_SIZE
;
151 link_order
->u
.data
.size
= link_order
->size
;
155 case lang_reloc_statement_enum
:
157 lang_reloc_statement_type
*rs
;
158 asection
*output_section
;
159 struct bfd_link_order
*link_order
;
161 rs
= &statement
->reloc_statement
;
163 output_section
= rs
->output_section
;
164 ASSERT (output_section
->owner
== link_info
.output_bfd
);
166 if (!((output_section
->flags
& SEC_HAS_CONTENTS
) != 0
167 || ((output_section
->flags
& SEC_LOAD
) != 0
168 && (output_section
->flags
& SEC_THREAD_LOCAL
))))
171 link_order
= bfd_new_link_order (link_info
.output_bfd
, output_section
);
172 if (link_order
== NULL
)
173 einfo (_("%F%P: bfd_new_link_order failed: %E\n"));
175 link_order
->offset
= rs
->output_offset
;
176 link_order
->size
= bfd_get_reloc_size (rs
->howto
);
178 link_order
->u
.reloc
.p
= (struct bfd_link_order_reloc
*)
179 bfd_alloc (link_info
.output_bfd
, sizeof (struct bfd_link_order_reloc
));
180 if (link_order
->u
.reloc
.p
== NULL
)
181 einfo (_("%F%P: bfd_new_link_order failed: %E\n"));
183 link_order
->u
.reloc
.p
->reloc
= rs
->reloc
;
184 link_order
->u
.reloc
.p
->addend
= rs
->addend_value
;
186 if (rs
->name
== NULL
)
188 link_order
->type
= bfd_section_reloc_link_order
;
189 if (rs
->section
->owner
== link_info
.output_bfd
)
190 link_order
->u
.reloc
.p
->u
.section
= rs
->section
;
193 link_order
->u
.reloc
.p
->u
.section
= rs
->section
->output_section
;
194 link_order
->u
.reloc
.p
->addend
+= rs
->section
->output_offset
;
199 link_order
->type
= bfd_symbol_reloc_link_order
;
200 link_order
->u
.reloc
.p
->u
.name
= rs
->name
;
205 case lang_input_section_enum
:
207 /* Create a new link_order in the output section with this
209 asection
*i
= statement
->input_section
.section
;
211 if (i
->sec_info_type
!= SEC_INFO_TYPE_JUST_SYMS
212 && (i
->flags
& SEC_EXCLUDE
) == 0)
214 asection
*output_section
= i
->output_section
;
215 struct bfd_link_order
*link_order
;
217 ASSERT (output_section
->owner
== link_info
.output_bfd
);
219 if (!((output_section
->flags
& SEC_HAS_CONTENTS
) != 0
220 || ((output_section
->flags
& SEC_LOAD
) != 0
221 && (output_section
->flags
& SEC_THREAD_LOCAL
))))
224 link_order
= bfd_new_link_order (link_info
.output_bfd
,
226 if (link_order
== NULL
)
227 einfo (_("%F%P: bfd_new_link_order failed: %E\n"));
229 if ((i
->flags
& SEC_NEVER_LOAD
) != 0
230 && (i
->flags
& SEC_DEBUGGING
) == 0)
232 /* We've got a never load section inside one which is
233 going to be output, we'll change it into a fill. */
234 link_order
->type
= bfd_data_link_order
;
235 link_order
->u
.data
.contents
= (unsigned char *) "";
236 link_order
->u
.data
.size
= 1;
240 link_order
->type
= bfd_indirect_link_order
;
241 link_order
->u
.indirect
.section
= i
;
242 ASSERT (i
->output_section
== output_section
);
244 link_order
->size
= i
->size
;
245 link_order
->offset
= i
->output_offset
;
250 case lang_padding_statement_enum
:
251 /* Make a new link_order with the right filler */
253 asection
*output_section
;
254 struct bfd_link_order
*link_order
;
256 output_section
= statement
->padding_statement
.output_section
;
257 ASSERT (statement
->padding_statement
.output_section
->owner
258 == link_info
.output_bfd
);
260 if (!((output_section
->flags
& SEC_HAS_CONTENTS
) != 0
261 || ((output_section
->flags
& SEC_LOAD
) != 0
262 && (output_section
->flags
& SEC_THREAD_LOCAL
))))
265 link_order
= bfd_new_link_order (link_info
.output_bfd
,
267 if (link_order
== NULL
)
268 einfo (_("%F%P: bfd_new_link_order failed: %E\n"));
269 link_order
->type
= bfd_data_link_order
;
270 link_order
->size
= statement
->padding_statement
.size
;
271 link_order
->offset
= statement
->padding_statement
.output_offset
;
272 link_order
->u
.data
.contents
= statement
->padding_statement
.fill
->data
;
273 link_order
->u
.data
.size
= statement
->padding_statement
.fill
->size
;
278 /* All the other ones fall through */
283 /* Return true if NAME is the name of an unsplittable section. These
284 are the stabs strings, dwarf strings. */
287 unsplittable_name (const char *name
)
289 if (startswith (name
, ".stab"))
291 /* There are several stab like string sections. We pattern match on
293 unsigned len
= strlen (name
);
294 if (strcmp (&name
[len
-3], "str") == 0)
297 else if (strcmp (name
, "$GDB_STRINGS$") == 0)
302 /* Wander around the input sections, make sure that
303 we'll never try and create an output section with more relocs
304 than will fit.. Do this by always assuming the worst case, and
305 creating new output sections with all the right bits. */
308 clone_section (bfd
*abfd
, asection
*s
, const char *name
, int *count
)
314 struct bfd_link_hash_entry
*h
;
316 /* Invent a section name from the section name and a dotted numeric
319 tname
= (char *) xmalloc (len
+ 1);
320 memcpy (tname
, name
, len
+ 1);
321 /* Remove a dotted number suffix, from a previous split link. */
322 while (len
&& ISDIGIT (tname
[len
-1]))
324 if (len
> 1 && tname
[len
-1] == '.')
325 /* It was a dotted number. */
328 /* We want to use the whole of the original section name for the
329 split name, but coff can be restricted to 8 character names. */
330 if (bfd_family_coff (abfd
) && strlen (tname
) > 5)
332 /* Some section names cannot be truncated, as the name is
333 used to locate some other section. */
334 if (startswith (name
, ".stab")
335 || strcmp (name
, "$GDB_SYMBOLS$") == 0)
337 einfo (_ ("%F%P: cannot create split section name for %s\n"), name
);
338 /* Silence gcc warnings. einfo exits, so we never reach here. */
344 if ((sname
= bfd_get_unique_section_name (abfd
, tname
, count
)) == NULL
345 || (n
= bfd_make_section_anyway (abfd
, sname
)) == NULL
346 || (h
= bfd_link_hash_lookup (link_info
.hash
,
347 sname
, true, true, false)) == NULL
)
349 einfo (_("%F%P: clone section failed: %E\n"));
350 /* Silence gcc warnings. einfo exits, so we never reach here. */
355 /* Set up section symbol. */
356 h
->type
= bfd_link_hash_defined
;
358 h
->u
.def
.section
= n
;
362 n
->user_set_vma
= s
->user_set_vma
;
365 n
->output_offset
= s
->output_offset
;
366 n
->output_section
= n
;
369 n
->alignment_power
= s
->alignment_power
;
371 bfd_copy_private_section_data (abfd
, s
, abfd
, n
);
380 struct bfd_link_order
*l
= s
->map_head
.link_order
;
381 printf ("vma %x size %x\n", s
->vma
, s
->size
);
384 if (l
->type
== bfd_indirect_link_order
)
385 printf ("%8x %s\n", l
->offset
, l
->u
.indirect
.section
->owner
->filename
);
387 printf (_("%8x something else\n"), l
->offset
);
393 dump (char *s
, asection
*a1
, asection
*a2
)
401 sanity_check (bfd
*abfd
)
404 for (s
= abfd
->sections
; s
; s
= s
->next
)
406 struct bfd_link_order
*p
;
408 for (p
= s
->map_head
.link_order
; p
; p
= p
->next
)
410 if (p
->offset
> 100000)
412 if (p
->offset
< prev
)
419 #define sanity_check(a)
420 #define dump(a, b, c)
424 split_sections (bfd
*abfd
, struct bfd_link_info
*info
)
426 asection
*original_sec
;
427 int nsecs
= abfd
->section_count
;
429 /* Look through all the original sections. */
430 for (original_sec
= abfd
->sections
;
431 original_sec
&& nsecs
;
432 original_sec
= original_sec
->next
, nsecs
--)
435 unsigned int lines
= 0;
436 unsigned int relocs
= 0;
437 bfd_size_type sec_size
= 0;
438 struct bfd_link_order
*l
;
439 struct bfd_link_order
*p
;
440 bfd_vma vma
= original_sec
->vma
;
441 asection
*cursor
= original_sec
;
443 /* Count up the relocations and line entries to see if anything
444 would be too big to fit. Accumulate section size too. */
445 for (l
= NULL
, p
= cursor
->map_head
.link_order
; p
!= NULL
; p
= l
->next
)
447 unsigned int thislines
= 0;
448 unsigned int thisrelocs
= 0;
449 bfd_size_type thissize
= 0;
450 if (p
->type
== bfd_indirect_link_order
)
454 sec
= p
->u
.indirect
.section
;
456 if (info
->strip
== strip_none
457 || info
->strip
== strip_some
)
458 thislines
= sec
->lineno_count
;
460 if (bfd_link_relocatable (info
))
461 thisrelocs
= sec
->reloc_count
;
463 thissize
= sec
->size
;
466 else if (bfd_link_relocatable (info
)
467 && (p
->type
== bfd_section_reloc_link_order
468 || p
->type
== bfd_symbol_reloc_link_order
))
472 && (thisrelocs
+ relocs
>= config
.split_by_reloc
473 || thislines
+ lines
>= config
.split_by_reloc
474 || (thissize
+ sec_size
>= config
.split_by_file
))
475 && !unsplittable_name (cursor
->name
))
477 /* Create a new section and put this link order and the
478 following link orders into it. */
479 bfd_vma shift_offset
;
482 n
= clone_section (abfd
, cursor
, original_sec
->name
, &count
);
484 /* Attach the link orders to the new section and snip
485 them off from the old section. */
486 n
->map_head
.link_order
= p
;
487 n
->map_tail
.link_order
= cursor
->map_tail
.link_order
;
488 cursor
->map_tail
.link_order
= l
;
492 /* Change the size of the original section and
493 update the vma of the new one. */
495 dump ("before snip", cursor
, n
);
497 shift_offset
= p
->offset
;
498 n
->size
= cursor
->size
- shift_offset
;
499 cursor
->size
= shift_offset
;
502 n
->lma
= n
->vma
= vma
;
504 /* Run down the chain and change the output section to
505 the right one, update the offsets too. */
508 p
->offset
-= shift_offset
;
509 if (p
->type
== bfd_indirect_link_order
)
511 p
->u
.indirect
.section
->output_section
= n
;
512 p
->u
.indirect
.section
->output_offset
= p
->offset
;
518 dump ("after snip", cursor
, n
);
527 relocs
+= thisrelocs
;
529 sec_size
+= thissize
;
536 /* Call BFD to write out the linked file. */
541 /* Reset error indicator, which can typically something like invalid
542 format from opening up the .o files. */
543 bfd_set_error (bfd_error_no_error
);
544 lang_clear_os_map ();
545 lang_for_each_statement (build_link_order
);
547 if (config
.split_by_reloc
!= (unsigned) -1
548 || config
.split_by_file
!= (bfd_size_type
) -1)
549 split_sections (link_info
.output_bfd
, &link_info
);
550 if (!bfd_final_link (link_info
.output_bfd
, &link_info
))
552 if (bfd_get_error () != bfd_error_no_error
)
553 einfo (_("%F%P: final link failed: %E\n"));
555 einfo (_("%F%P: final link failed\n"));