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 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 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 * 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 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 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 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 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 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