Home | History | Annotate | Line # | Download | only in ld
ldelfgen.c revision 1.1.1.5
      1 /* Emulation code used by all ELF targets.
      2    Copyright (C) 1991-2026 Free Software Foundation, Inc.
      3 
      4    This file is part of the GNU Binutils.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19    MA 02110-1301, USA.  */
     20 
     21 #include "sysdep.h"
     22 #include "libiberty.h"
     23 #include "bfd.h"
     24 #include "bfdlink.h"
     25 #include "ctf-api.h"
     26 #include "ld.h"
     27 #include "ldmain.h"
     28 #include "ldmisc.h"
     29 #include "ldexp.h"
     30 #include "ldlang.h"
     31 #include "ldctor.h"
     32 #include "elf-bfd.h"
     33 #include "elf/internal.h"
     34 #include "ldelfgen.h"
     35 
     36 /* Info attached to an output_section_statement about input sections,
     37    used when sorting SHF_LINK_ORDER sections.  */
     38 
     39 struct os_sections
     40 {
     41   /* Size allocated for isec.  */
     42   unsigned int alloc;
     43   /* Used entries in isec.  */
     44   unsigned int count;
     45   /* How many are SHF_LINK_ORDER.  */
     46   unsigned int ordered;
     47   /* Input sections attached to this output section.  */
     48   struct os_sections_input {
     49     lang_input_section_type *is;
     50     unsigned int idx;
     51   } isec[1];
     52 };
     53 
     54 /* Add IS to data kept for OS.  */
     55 
     56 static bool
     57 add_link_order_input_section (lang_input_section_type *is,
     58 			      lang_output_section_statement_type *os)
     59 {
     60   struct os_sections *os_info = os->data;
     61   asection *s;
     62 
     63   if (os_info == NULL)
     64     {
     65       os_info = xmalloc (sizeof (*os_info) + 63 * sizeof (*os_info->isec));
     66       os_info->alloc = 64;
     67       os_info->count = 0;
     68       os_info->ordered = 0;
     69       os->data = os_info;
     70     }
     71   if (os_info->count == os_info->alloc)
     72     {
     73       size_t want;
     74       os_info->alloc *= 2;
     75       want = sizeof (*os_info) + (os_info->alloc - 1) * sizeof (*os_info->isec);
     76       os_info = xrealloc (os_info, want);
     77       os->data = os_info;
     78     }
     79   os_info->isec[os_info->count].is = is;
     80   os_info->isec[os_info->count].idx = os_info->count;
     81   os_info->count++;
     82   s = is->section;
     83   if (bfd_get_flavour (s->owner) == bfd_target_elf_flavour
     84       && (s->flags & SEC_LINKER_CREATED) == 0
     85       && elf_linked_to_section (s) != NULL)
     86     os_info->ordered++;
     87   return false;
     88 }
     89 
     90 /* Run over the linker's statement list, extracting info about input
     91    sections attached to each output section.  */
     92 
     93 static bool
     94 link_order_scan (lang_statement_union_type *u,
     95 		 lang_output_section_statement_type *os)
     96 {
     97   asection *s;
     98   bool ret = false;
     99 
    100   for (; u != NULL; u = u->header.next)
    101     {
    102       switch (u->header.type)
    103 	{
    104 	case lang_wild_statement_enum:
    105 	  if (link_order_scan (u->wild_statement.children.head, os))
    106 	    ret = true;
    107 	  break;
    108 	case lang_constructors_statement_enum:
    109 	  if (link_order_scan (constructor_list.head, os))
    110 	    ret = true;
    111 	  break;
    112 	case lang_output_section_statement_enum:
    113 	  if (u->output_section_statement.constraint != -1
    114 	      && link_order_scan (u->output_section_statement.children.head,
    115 				  &u->output_section_statement))
    116 	    ret = true;
    117 	  break;
    118 	case lang_group_statement_enum:
    119 	  if (link_order_scan (u->group_statement.children.head, os))
    120 	    ret = true;
    121 	  break;
    122 	case lang_input_section_enum:
    123 	  s = u->input_section.section;
    124 	  if (s->output_section != NULL
    125 	      && s->output_section->owner == link_info.output_bfd
    126 	      && (s->output_section->flags & SEC_EXCLUDE) == 0
    127 	      && ((s->output_section->flags & SEC_HAS_CONTENTS) != 0
    128 		  || ((s->output_section->flags & (SEC_LOAD | SEC_THREAD_LOCAL))
    129 		      == (SEC_LOAD | SEC_THREAD_LOCAL))))
    130 	    if (add_link_order_input_section (&u->input_section, os))
    131 	      ret = true;
    132 	  break;
    133 	default:
    134 	  break;
    135 	}
    136     }
    137   return ret;
    138 }
    139 
    140 /* Compare two sections based on the locations of the sections they are
    141    linked to.  Used by fixup_link_order.  */
    142 
    143 static int
    144 compare_link_order (const void *a, const void *b)
    145 {
    146   const struct os_sections_input *ai = a;
    147   const struct os_sections_input *bi = b;
    148   asection *asec = NULL;
    149   asection *bsec = NULL;
    150   bfd_vma apos, bpos;
    151 
    152   if (bfd_get_flavour (ai->is->section->owner) == bfd_target_elf_flavour)
    153     asec = elf_linked_to_section (ai->is->section);
    154   if (bfd_get_flavour (bi->is->section->owner) == bfd_target_elf_flavour)
    155     bsec = elf_linked_to_section (bi->is->section);
    156 
    157   /* Place unordered sections before ordered sections.  */
    158   if (asec == NULL || bsec == NULL)
    159     {
    160       if (bsec != NULL)
    161 	return -1;
    162       else if (asec != NULL)
    163 	return 1;
    164       return ai->idx - bi->idx;
    165     }
    166 
    167   apos = asec->output_section->lma + asec->output_offset;
    168   bpos = bsec->output_section->lma + bsec->output_offset;
    169 
    170   if (apos < bpos)
    171     return -1;
    172   else if (apos > bpos)
    173     return 1;
    174 
    175   if (! bfd_link_relocatable (&link_info))
    176     {
    177       /* The only way we should get matching LMAs is when the first of
    178 	 the two sections has zero size, or asec and bsec are the
    179 	 same section.  */
    180       if (asec->size < bsec->size)
    181 	return -1;
    182       else if (asec->size > bsec->size)
    183 	return 1;
    184     }
    185 
    186   /* If they are both zero size then they almost certainly have the same
    187      VMA and thus are not ordered with respect to each other.  Test VMA
    188      anyway, and fall back to idx to make the result reproducible across
    189      qsort implementations.  */
    190   apos = asec->output_section->vma + asec->output_offset;
    191   bpos = bsec->output_section->vma + bsec->output_offset;
    192   if (apos < bpos)
    193     return -1;
    194   else if (apos > bpos)
    195     return 1;
    196   else
    197     return ai->idx - bi->idx;
    198 }
    199 
    200 /* Rearrange sections with SHF_LINK_ORDER into the same order as their
    201    linked sections.  */
    202 
    203 static bool
    204 fixup_link_order (lang_output_section_statement_type *os)
    205 {
    206   struct os_sections *os_info = os->data;
    207   unsigned int i, j;
    208   lang_input_section_type **orig_is;
    209   asection **save_s;
    210 
    211   for (i = 0; i < os_info->count; i = j)
    212     {
    213       /* Normally a linker script will select SHF_LINK_ORDER sections
    214 	 with an input section wildcard something like the following:
    215 	 *(.IA_64.unwind* .gnu.linkonce.ia64unw.*)
    216 	 However if some other random sections are smashed into an
    217 	 output section, or if SHF_LINK_ORDER are split up by the
    218 	 linker script, then we only want to sort sections matching a
    219 	 given wildcard.  That's the purpose of the pattern test.  */
    220       for (j = i + 1; j < os_info->count; j++)
    221 	if (os_info->isec[j].is->pattern != os_info->isec[i].is->pattern)
    222 	  break;
    223       if (j - i > 1)
    224 	qsort (&os_info->isec[i], j - i, sizeof (*os_info->isec),
    225 	       compare_link_order);
    226     }
    227   for (i = 0; i < os_info->count; i++)
    228     if (os_info->isec[i].idx != i)
    229       break;
    230   if (i == os_info->count)
    231     return false;
    232 
    233   /* Now reorder the linker input section statements to reflect the
    234      proper sorting.  The is done by rewriting the existing statements
    235      rather than fiddling with lists, since the only thing we need to
    236      change is the bfd section pointer.  */
    237   orig_is = xmalloc (os_info->count * sizeof (*orig_is));
    238   save_s = xmalloc (os_info->count * sizeof (*save_s));
    239   for (i = 0; i < os_info->count; i++)
    240     {
    241       orig_is[os_info->isec[i].idx] = os_info->isec[i].is;
    242       save_s[i] = os_info->isec[i].is->section;
    243     }
    244   for (i = 0; i < os_info->count; i++)
    245     if (os_info->isec[i].idx != i)
    246       {
    247 	orig_is[i]->section = save_s[i];
    248 	/* Restore os_info to pristine state before the qsort, for the
    249 	   next pass over sections.  */
    250 	os_info->isec[i].is = orig_is[i];
    251 	os_info->isec[i].idx = i;
    252       }
    253   free (save_s);
    254   free (orig_is);
    255   return true;
    256 }
    257 
    258 void
    259 ldelf_map_segments (bool need_layout)
    260 {
    261   int tries = 10;
    262   static bool done_link_order_scan = false;
    263 
    264   do
    265     {
    266       lang_relax_sections (need_layout);
    267       need_layout = false;
    268 
    269       if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour)
    270 	{
    271 	  lang_output_section_statement_type *os;
    272 	  if (!done_link_order_scan)
    273 	    {
    274 	      link_order_scan (statement_list.head, NULL);
    275 	      done_link_order_scan = true;
    276 	    }
    277 	  for (os = (void *) lang_os_list.head; os != NULL; os = os->next)
    278 	    {
    279 	      struct os_sections *os_info = os->data;
    280 	      if (os_info != NULL && os_info->ordered != 0)
    281 		{
    282 		  if (os_info->ordered != os_info->count
    283 		      && bfd_link_relocatable (&link_info))
    284 		    {
    285 		      fatal (_("%P: "
    286 			       "%pA has both ordered and unordered sections\n"),
    287 			     os->bfd_section);
    288 		      return;
    289 		    }
    290 		  if (os_info->count > 1
    291 		      && fixup_link_order (os))
    292 		    need_layout = true;
    293 		}
    294 	    }
    295 	}
    296 
    297       if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour
    298 	  && !bfd_link_relocatable (&link_info))
    299 	{
    300 	  bfd_size_type phdr_size;
    301 
    302 	  phdr_size = elf_program_header_size (link_info.output_bfd);
    303 	  /* If we don't have user supplied phdrs, throw away any
    304 	     previous linker generated program headers.  */
    305 	  if (lang_phdr_list == NULL)
    306 	    elf_seg_map (link_info.output_bfd) = NULL;
    307 	  if (!bfd_elf_map_sections_to_segments (link_info.output_bfd,
    308 						 &link_info, &need_layout))
    309 	    fatal (_("%P: map sections to segments failed: %E\n"));
    310 
    311 	  if (phdr_size != elf_program_header_size (link_info.output_bfd))
    312 	    {
    313 	      if (tries > 6)
    314 		/* The first few times we allow any change to
    315 		   phdr_size .  */
    316 		need_layout = true;
    317 	      else if (phdr_size
    318 		       < elf_program_header_size (link_info.output_bfd))
    319 		/* After that we only allow the size to grow.  */
    320 		need_layout = true;
    321 	      else
    322 		elf_program_header_size (link_info.output_bfd) = phdr_size;
    323 	    }
    324 	}
    325     }
    326   while (need_layout && --tries);
    327 
    328   if (tries == 0)
    329     fatal (_("%P: looping in map_segments\n"));
    330 
    331   if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour
    332       && lang_phdr_list == NULL)
    333     {
    334       /* If we don't have user supplied phdrs, strip zero-sized dynamic
    335 	 sections and regenerate program headers.  */
    336       elf_backend_data *bed = get_elf_backend_data (link_info.output_bfd);
    337       if (bed->elf_backend_strip_zero_sized_dynamic_sections
    338 	  && !bed->elf_backend_strip_zero_sized_dynamic_sections (&link_info))
    339 	fatal (_("%P: failed to strip zero-sized dynamic sections\n"));
    340     }
    341 }
    342 
    343 #ifdef ENABLE_LIBCTF
    344 /* We want to emit CTF early if and only if we are not targetting ELF with this
    345    invocation.  */
    346 
    347 int
    348 ldelf_emit_ctf_early (void)
    349 {
    350   if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour)
    351     return 0;
    352   return 1;
    353 }
    354 
    355 /* Callbacks used to map from bfd types to libctf types, under libctf's
    356    control.  */
    357 
    358 struct ctf_strtab_iter_cb_arg
    359 {
    360   struct elf_strtab_hash *strtab;
    361   size_t next_i;
    362   size_t next_idx;
    363 };
    364 
    365 /* Return strings from the strtab to libctf, one by one.  Returns NULL when
    366    iteration is complete.  */
    367 
    368 static const char *
    369 ldelf_ctf_strtab_iter_cb (uint32_t *offset, void *arg_)
    370 {
    371   bfd_size_type off;
    372   const char *ret;
    373 
    374   struct ctf_strtab_iter_cb_arg *arg =
    375     (struct ctf_strtab_iter_cb_arg *) arg_;
    376 
    377   /* There is no zeroth string.  */
    378   if (arg->next_i == 0)
    379     arg->next_i = 1;
    380 
    381   /* Hunt through strings until we fall off the end or find one with
    382      a nonzero refcount.  */
    383   do
    384     {
    385       if (arg->next_i >= bfd_elf_strtab_len (arg->strtab))
    386 	{
    387 	  arg->next_i = 0;
    388 	  return NULL;
    389 	}
    390 
    391       ret = bfd_elf_strtab_str (arg->strtab, arg->next_i++, &off);
    392     }
    393   while (ret == NULL);
    394 
    395   *offset = off;
    396 
    397   /* If we've overflowed, we cannot share any further strings: the CTF
    398      format cannot encode strings with such high offsets.  */
    399   if (*offset != off)
    400     return NULL;
    401 
    402   return ret;
    403 }
    404 
    405 void
    406 ldelf_acquire_strings_for_ctf
    407   (struct ctf_dict *ctf_output, struct elf_strtab_hash *strtab)
    408 {
    409   struct ctf_strtab_iter_cb_arg args = { strtab, 0, 0 };
    410   if (!ctf_output)
    411     return;
    412 
    413   if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour)
    414     {
    415       if (ctf_link_add_strtab (ctf_output, ldelf_ctf_strtab_iter_cb,
    416 			       &args) < 0)
    417 	fatal (_("%P: warning: CTF strtab association failed; strings will "
    418 		 "not be shared: %s\n"),
    419 	       ctf_errmsg (ctf_errno (ctf_output)));
    420     }
    421 }
    422 
    423 void
    424 ldelf_new_dynsym_for_ctf (struct ctf_dict *ctf_output, int symidx,
    425 			  struct elf_internal_sym *sym)
    426 {
    427   ctf_link_sym_t lsym;
    428 
    429   if (!ctf_output)
    430      return;
    431 
    432   /* New symbol.  */
    433   if (sym != NULL)
    434     {
    435       lsym.st_name = NULL;
    436       lsym.st_nameidx = sym->st_name;
    437       lsym.st_nameidx_set = 1;
    438       lsym.st_symidx = symidx;
    439       lsym.st_shndx = sym->st_shndx;
    440       lsym.st_type = ELF_ST_TYPE (sym->st_info);
    441       lsym.st_value = sym->st_value;
    442       if (ctf_link_add_linker_symbol (ctf_output, &lsym) < 0)
    443 	{
    444 	  fatal (_("%P: warning: CTF symbol addition failed; CTF will "
    445 		   "not be tied to symbols: %s\n"),
    446 		 ctf_errmsg (ctf_errno (ctf_output)));
    447 	}
    448     }
    449   else
    450     {
    451       /* Shuffle all the symbols.  */
    452 
    453       if (ctf_link_shuffle_syms (ctf_output) < 0)
    454 	fatal (_("%P: warning: CTF symbol shuffling failed; CTF will "
    455 		 "not be tied to symbols: %s\n"),
    456 	       ctf_errmsg (ctf_errno (ctf_output)));
    457     }
    458 }
    459 #else
    460 int
    461 ldelf_emit_ctf_early (void)
    462 {
    463   return 0;
    464 }
    465 
    466 void
    467 ldelf_acquire_strings_for_ctf (struct ctf_dict *ctf_output ATTRIBUTE_UNUSED,
    468 			       struct elf_strtab_hash *strtab ATTRIBUTE_UNUSED)
    469 {}
    470 void
    471 ldelf_new_dynsym_for_ctf (struct ctf_dict *ctf_output ATTRIBUTE_UNUSED,
    472 			  int symidx ATTRIBUTE_UNUSED,
    473 			  struct elf_internal_sym *sym ATTRIBUTE_UNUSED)
    474 {}
    475 #endif
    476