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