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