elf-eh-frame.c revision 130561
1/* .eh_frame section optimization.
2   Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
3   Written by Jakub Jelinek <jakub@redhat.com>.
4
5   This file is part of BFD, the Binary File Descriptor library.
6
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 2 of the License, or
10   (at your option) any later version.
11
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.
16
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21#include "bfd.h"
22#include "sysdep.h"
23#include "libbfd.h"
24#include "elf-bfd.h"
25#include "elf/dwarf2.h"
26
27#define EH_FRAME_HDR_SIZE 8
28
29/* Helper function for reading uleb128 encoded data.  */
30
31static bfd_vma
32read_unsigned_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
33		      char *buf,
34		      unsigned int *bytes_read_ptr)
35{
36  bfd_vma result;
37  unsigned int num_read;
38  int shift;
39  unsigned char byte;
40
41  result = 0;
42  shift = 0;
43  num_read = 0;
44  do
45    {
46      byte = bfd_get_8 (abfd, (bfd_byte *) buf);
47      buf++;
48      num_read++;
49      result |= (((bfd_vma) byte & 0x7f) << shift);
50      shift += 7;
51    }
52  while (byte & 0x80);
53  *bytes_read_ptr = num_read;
54  return result;
55}
56
57/* Helper function for reading sleb128 encoded data.  */
58
59static bfd_signed_vma
60read_signed_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
61		    char *buf,
62		    unsigned int * bytes_read_ptr)
63{
64  bfd_vma result;
65  int shift;
66  int num_read;
67  unsigned char byte;
68
69  result = 0;
70  shift = 0;
71  num_read = 0;
72  do
73    {
74      byte = bfd_get_8 (abfd, (bfd_byte *) buf);
75      buf ++;
76      num_read ++;
77      result |= (((bfd_vma) byte & 0x7f) << shift);
78      shift += 7;
79    }
80  while (byte & 0x80);
81  if (byte & 0x40)
82    result |= (((bfd_vma) -1) << (shift - 7)) << 7;
83  *bytes_read_ptr = num_read;
84  return result;
85}
86
87#define read_uleb128(VAR, BUF)					\
88do								\
89  {								\
90    (VAR) = read_unsigned_leb128 (abfd, buf, &leb128_tmp);	\
91    (BUF) += leb128_tmp;					\
92  }								\
93while (0)
94
95#define read_sleb128(VAR, BUF)					\
96do								\
97  {								\
98    (VAR) = read_signed_leb128 (abfd, buf, &leb128_tmp);	\
99    (BUF) += leb128_tmp;					\
100  }								\
101while (0)
102
103/* Return 0 if either encoding is variable width, or not yet known to bfd.  */
104
105static
106int get_DW_EH_PE_width (int encoding, int ptr_size)
107{
108  /* DW_EH_PE_ values of 0x60 and 0x70 weren't defined at the time .eh_frame
109     was added to bfd.  */
110  if ((encoding & 0x60) == 0x60)
111    return 0;
112
113  switch (encoding & 7)
114    {
115    case DW_EH_PE_udata2: return 2;
116    case DW_EH_PE_udata4: return 4;
117    case DW_EH_PE_udata8: return 8;
118    case DW_EH_PE_absptr: return ptr_size;
119    default:
120      break;
121    }
122
123  return 0;
124}
125
126#define get_DW_EH_PE_signed(encoding) (((encoding) & DW_EH_PE_signed) != 0)
127
128/* Read a width sized value from memory.  */
129
130static bfd_vma
131read_value (bfd *abfd, bfd_byte *buf, int width, int is_signed)
132{
133  bfd_vma value;
134
135  switch (width)
136    {
137    case 2:
138      if (is_signed)
139	value = bfd_get_signed_16 (abfd, buf);
140      else
141	value = bfd_get_16 (abfd, buf);
142      break;
143    case 4:
144      if (is_signed)
145	value = bfd_get_signed_32 (abfd, buf);
146      else
147	value = bfd_get_32 (abfd, buf);
148      break;
149    case 8:
150      if (is_signed)
151	value = bfd_get_signed_64 (abfd, buf);
152      else
153	value = bfd_get_64 (abfd, buf);
154      break;
155    default:
156      BFD_FAIL ();
157      return 0;
158    }
159
160  return value;
161}
162
163/* Store a width sized value to memory.  */
164
165static void
166write_value (bfd *abfd, bfd_byte *buf, bfd_vma value, int width)
167{
168  switch (width)
169    {
170    case 2: bfd_put_16 (abfd, value, buf); break;
171    case 4: bfd_put_32 (abfd, value, buf); break;
172    case 8: bfd_put_64 (abfd, value, buf); break;
173    default: BFD_FAIL ();
174    }
175}
176
177/* Return zero if C1 and C2 CIEs can be merged.  */
178
179static
180int cie_compare (struct cie *c1, struct cie *c2)
181{
182  if (c1->hdr.length == c2->hdr.length
183      && c1->version == c2->version
184      && strcmp (c1->augmentation, c2->augmentation) == 0
185      && strcmp (c1->augmentation, "eh") != 0
186      && c1->code_align == c2->code_align
187      && c1->data_align == c2->data_align
188      && c1->ra_column == c2->ra_column
189      && c1->augmentation_size == c2->augmentation_size
190      && c1->personality == c2->personality
191      && c1->per_encoding == c2->per_encoding
192      && c1->lsda_encoding == c2->lsda_encoding
193      && c1->fde_encoding == c2->fde_encoding
194      && c1->initial_insn_length == c2->initial_insn_length
195      && memcmp (c1->initial_instructions,
196		 c2->initial_instructions,
197		 c1->initial_insn_length) == 0)
198    return 0;
199
200  return 1;
201}
202
203/* This function is called for each input file before the .eh_frame
204   section is relocated.  It discards duplicate CIEs and FDEs for discarded
205   functions.  The function returns TRUE iff any entries have been
206   deleted.  */
207
208bfd_boolean
209_bfd_elf_discard_section_eh_frame
210   (bfd *abfd, struct bfd_link_info *info, asection *sec,
211    bfd_boolean (*reloc_symbol_deleted_p) (bfd_vma, void *),
212    struct elf_reloc_cookie *cookie)
213{
214  bfd_byte *ehbuf = NULL, *buf;
215  bfd_byte *last_cie, *last_fde;
216  struct cie_header hdr;
217  struct cie cie;
218  struct elf_link_hash_table *htab;
219  struct eh_frame_hdr_info *hdr_info;
220  struct eh_frame_sec_info *sec_info = NULL;
221  unsigned int leb128_tmp;
222  unsigned int cie_usage_count, last_cie_ndx, i, offset;
223  unsigned int make_relative, make_lsda_relative;
224  bfd_size_type new_size;
225  unsigned int ptr_size;
226
227  if (sec->_raw_size == 0)
228    {
229      /* This file does not contain .eh_frame information.  */
230      return FALSE;
231    }
232
233  if ((sec->output_section != NULL
234       && bfd_is_abs_section (sec->output_section)))
235    {
236      /* At least one of the sections is being discarded from the
237         link, so we should just ignore them.  */
238      return FALSE;
239    }
240
241  htab = elf_hash_table (info);
242  hdr_info = &htab->eh_info;
243
244  /* Read the frame unwind information from abfd.  */
245
246  ehbuf = bfd_malloc (sec->_raw_size);
247  if (ehbuf == NULL)
248    goto free_no_table;
249
250  if (! bfd_get_section_contents (abfd, sec, ehbuf, 0, sec->_raw_size))
251    goto free_no_table;
252
253  if (sec->_raw_size >= 4
254      && bfd_get_32 (abfd, ehbuf) == 0
255      && cookie->rel == cookie->relend)
256    {
257      /* Empty .eh_frame section.  */
258      free (ehbuf);
259      return FALSE;
260    }
261
262  /* If .eh_frame section size doesn't fit into int, we cannot handle
263     it (it would need to use 64-bit .eh_frame format anyway).  */
264  if (sec->_raw_size != (unsigned int) sec->_raw_size)
265    goto free_no_table;
266
267  ptr_size = (elf_elfheader (abfd)->e_ident[EI_CLASS]
268	      == ELFCLASS64) ? 8 : 4;
269  buf = ehbuf;
270  last_cie = NULL;
271  last_cie_ndx = 0;
272  memset (&cie, 0, sizeof (cie));
273  cie_usage_count = 0;
274  new_size = sec->_raw_size;
275  make_relative = hdr_info->last_cie.make_relative;
276  make_lsda_relative = hdr_info->last_cie.make_lsda_relative;
277  sec_info = bfd_zmalloc (sizeof (struct eh_frame_sec_info)
278			  + 99 * sizeof (struct eh_cie_fde));
279  if (sec_info == NULL)
280    goto free_no_table;
281  sec_info->alloced = 100;
282
283#define ENSURE_NO_RELOCS(buf)				\
284  if (cookie->rel < cookie->relend			\
285      && (cookie->rel->r_offset				\
286	  < (bfd_size_type) ((buf) - ehbuf))		\
287      && cookie->rel->r_info != 0)			\
288    goto free_no_table
289
290#define SKIP_RELOCS(buf)				\
291  while (cookie->rel < cookie->relend			\
292         && (cookie->rel->r_offset			\
293	     < (bfd_size_type) ((buf) - ehbuf)))	\
294    cookie->rel++
295
296#define GET_RELOC(buf)					\
297  ((cookie->rel < cookie->relend			\
298    && (cookie->rel->r_offset				\
299        == (bfd_size_type) ((buf) - ehbuf)))		\
300   ? cookie->rel : NULL)
301
302  for (;;)
303    {
304      unsigned char *aug;
305
306      if (sec_info->count == sec_info->alloced)
307	{
308	  sec_info = bfd_realloc (sec_info,
309				  sizeof (struct eh_frame_sec_info)
310				  + (sec_info->alloced + 99)
311				     * sizeof (struct eh_cie_fde));
312	  if (sec_info == NULL)
313	    goto free_no_table;
314
315	  memset (&sec_info->entry[sec_info->alloced], 0,
316		  100 * sizeof (struct eh_cie_fde));
317	  sec_info->alloced += 100;
318	}
319
320      last_fde = buf;
321      /* If we are at the end of the section, we still need to decide
322	 on whether to output or discard last encountered CIE (if any).  */
323      if ((bfd_size_type) (buf - ehbuf) == sec->_raw_size)
324	hdr.id = (unsigned int) -1;
325      else
326	{
327	  if ((bfd_size_type) (buf + 4 - ehbuf) > sec->_raw_size)
328	    /* No space for CIE/FDE header length.  */
329	    goto free_no_table;
330
331	  hdr.length = bfd_get_32 (abfd, buf);
332	  if (hdr.length == 0xffffffff)
333	    /* 64-bit .eh_frame is not supported.  */
334	    goto free_no_table;
335	  buf += 4;
336	  if ((bfd_size_type) (buf - ehbuf) + hdr.length > sec->_raw_size)
337	    /* CIE/FDE not contained fully in this .eh_frame input section.  */
338	    goto free_no_table;
339
340	  sec_info->entry[sec_info->count].offset = last_fde - ehbuf;
341	  sec_info->entry[sec_info->count].size = 4 + hdr.length;
342
343	  if (hdr.length == 0)
344	    {
345	      /* CIE with length 0 must be only the last in the section.  */
346	      if ((bfd_size_type) (buf - ehbuf) < sec->_raw_size)
347		goto free_no_table;
348	      ENSURE_NO_RELOCS (buf);
349	      sec_info->count++;
350	      /* Now just finish last encountered CIE processing and break
351		 the loop.  */
352	      hdr.id = (unsigned int) -1;
353	    }
354	  else
355	    {
356	      hdr.id = bfd_get_32 (abfd, buf);
357	      buf += 4;
358	      if (hdr.id == (unsigned int) -1)
359		goto free_no_table;
360	    }
361	}
362
363      if (hdr.id == 0 || hdr.id == (unsigned int) -1)
364	{
365	  unsigned int initial_insn_length;
366
367	  /* CIE  */
368	  if (last_cie != NULL)
369	    {
370	      /* Now check if this CIE is identical to the last CIE,
371		 in which case we can remove it provided we adjust
372		 all FDEs.  Also, it can be removed if we have removed
373		 all FDEs using it.  */
374	      if ((!info->relocatable
375		   && hdr_info->last_cie_sec
376		   && (sec->output_section
377		       == hdr_info->last_cie_sec->output_section)
378		   && cie_compare (&cie, &hdr_info->last_cie) == 0)
379		  || cie_usage_count == 0)
380		{
381		  new_size -= cie.hdr.length + 4;
382		  sec_info->entry[last_cie_ndx].removed = 1;
383		  sec_info->entry[last_cie_ndx].sec = hdr_info->last_cie_sec;
384		  sec_info->entry[last_cie_ndx].new_offset
385		    = hdr_info->last_cie_offset;
386		}
387	      else
388		{
389		  hdr_info->last_cie = cie;
390		  hdr_info->last_cie_sec = sec;
391		  hdr_info->last_cie_offset = last_cie - ehbuf;
392		  sec_info->entry[last_cie_ndx].make_relative
393		    = cie.make_relative;
394		  sec_info->entry[last_cie_ndx].make_lsda_relative
395		    = cie.make_lsda_relative;
396		  sec_info->entry[last_cie_ndx].per_encoding_relative
397		    = (cie.per_encoding & 0x70) == DW_EH_PE_pcrel;
398		}
399	    }
400
401	  if (hdr.id == (unsigned int) -1)
402	    break;
403
404	  last_cie_ndx = sec_info->count;
405	  sec_info->entry[sec_info->count].cie = 1;
406
407	  cie_usage_count = 0;
408	  memset (&cie, 0, sizeof (cie));
409	  cie.hdr = hdr;
410	  cie.version = *buf++;
411
412	  /* Cannot handle unknown versions.  */
413	  if (cie.version != 1)
414	    goto free_no_table;
415	  if (strlen (buf) > sizeof (cie.augmentation) - 1)
416	    goto free_no_table;
417
418	  strcpy (cie.augmentation, buf);
419	  buf = strchr (buf, '\0') + 1;
420	  ENSURE_NO_RELOCS (buf);
421	  if (buf[0] == 'e' && buf[1] == 'h')
422	    {
423	      /* GCC < 3.0 .eh_frame CIE */
424	      /* We cannot merge "eh" CIEs because __EXCEPTION_TABLE__
425		 is private to each CIE, so we don't need it for anything.
426		 Just skip it.  */
427	      buf += ptr_size;
428	      SKIP_RELOCS (buf);
429	    }
430	  read_uleb128 (cie.code_align, buf);
431	  read_sleb128 (cie.data_align, buf);
432	  /* Note - in DWARF2 the return address column is an unsigned byte.
433	     In DWARF3 it is a ULEB128.  We are following DWARF3.  For most
434	     ports this will not matter as the value will be less than 128.
435	     For the others (eg FRV, SH, MMIX, IA64) they need a fixed GCC
436	     which conforms to the DWARF3 standard.  */
437	  read_uleb128 (cie.ra_column, buf);
438	  ENSURE_NO_RELOCS (buf);
439	  cie.lsda_encoding = DW_EH_PE_omit;
440	  cie.fde_encoding = DW_EH_PE_omit;
441	  cie.per_encoding = DW_EH_PE_omit;
442	  aug = cie.augmentation;
443	  if (aug[0] != 'e' || aug[1] != 'h')
444	    {
445	      if (*aug == 'z')
446		{
447		  aug++;
448		  read_uleb128 (cie.augmentation_size, buf);
449	  	  ENSURE_NO_RELOCS (buf);
450		}
451
452	      while (*aug != '\0')
453		switch (*aug++)
454		  {
455		  case 'L':
456		    cie.lsda_encoding = *buf++;
457		    ENSURE_NO_RELOCS (buf);
458		    if (get_DW_EH_PE_width (cie.lsda_encoding, ptr_size) == 0)
459		      goto free_no_table;
460		    break;
461		  case 'R':
462		    cie.fde_encoding = *buf++;
463		    ENSURE_NO_RELOCS (buf);
464		    if (get_DW_EH_PE_width (cie.fde_encoding, ptr_size) == 0)
465		      goto free_no_table;
466		    break;
467		  case 'P':
468		    {
469		      int per_width;
470
471		      cie.per_encoding = *buf++;
472		      per_width = get_DW_EH_PE_width (cie.per_encoding,
473						      ptr_size);
474		      if (per_width == 0)
475			goto free_no_table;
476		      if ((cie.per_encoding & 0xf0) == DW_EH_PE_aligned)
477			buf = (ehbuf
478			       + ((buf - ehbuf + per_width - 1)
479				  & ~((bfd_size_type) per_width - 1)));
480		      ENSURE_NO_RELOCS (buf);
481		      /* Ensure we have a reloc here, against
482			 a global symbol.  */
483		      if (GET_RELOC (buf) != NULL)
484			{
485			  unsigned long r_symndx;
486
487#ifdef BFD64
488			  if (ptr_size == 8)
489			    r_symndx = ELF64_R_SYM (cookie->rel->r_info);
490			  else
491#endif
492			    r_symndx = ELF32_R_SYM (cookie->rel->r_info);
493			  if (r_symndx >= cookie->locsymcount)
494			    {
495			      struct elf_link_hash_entry *h;
496
497			      r_symndx -= cookie->extsymoff;
498			      h = cookie->sym_hashes[r_symndx];
499
500			      while (h->root.type == bfd_link_hash_indirect
501				     || h->root.type == bfd_link_hash_warning)
502				h = (struct elf_link_hash_entry *)
503				    h->root.u.i.link;
504
505			      cie.personality = h;
506			    }
507			  cookie->rel++;
508			}
509		      buf += per_width;
510		    }
511		    break;
512		  default:
513		    /* Unrecognized augmentation. Better bail out.  */
514		    goto free_no_table;
515		  }
516	    }
517
518	  /* For shared libraries, try to get rid of as many RELATIVE relocs
519	     as possible.  */
520          if (info->shared
521	      && (get_elf_backend_data (abfd)
522		  ->elf_backend_can_make_relative_eh_frame
523		  (abfd, info, sec))
524	      && (cie.fde_encoding & 0xf0) == DW_EH_PE_absptr)
525	    cie.make_relative = 1;
526
527	  if (info->shared
528	      && (get_elf_backend_data (abfd)
529		  ->elf_backend_can_make_lsda_relative_eh_frame
530		  (abfd, info, sec))
531	      && (cie.lsda_encoding & 0xf0) == DW_EH_PE_absptr)
532	    cie.make_lsda_relative = 1;
533
534	  /* If FDE encoding was not specified, it defaults to
535	     DW_EH_absptr.  */
536	  if (cie.fde_encoding == DW_EH_PE_omit)
537	    cie.fde_encoding = DW_EH_PE_absptr;
538
539	  initial_insn_length = cie.hdr.length - (buf - last_fde - 4);
540	  if (initial_insn_length <= 50)
541	    {
542	      cie.initial_insn_length = initial_insn_length;
543	      memcpy (cie.initial_instructions, buf, initial_insn_length);
544	    }
545	  buf += initial_insn_length;
546	  ENSURE_NO_RELOCS (buf);
547	  last_cie = last_fde;
548	}
549      else
550	{
551	  /* Ensure this FDE uses the last CIE encountered.  */
552	  if (last_cie == NULL
553	      || hdr.id != (unsigned int) (buf - 4 - last_cie))
554	    goto free_no_table;
555
556	  ENSURE_NO_RELOCS (buf);
557	  if (GET_RELOC (buf) == NULL)
558	    /* This should not happen.  */
559	    goto free_no_table;
560	  if ((*reloc_symbol_deleted_p) (buf - ehbuf, cookie))
561	    {
562	      /* This is a FDE against a discarded section.  It should
563		 be deleted.  */
564	      new_size -= hdr.length + 4;
565	      sec_info->entry[sec_info->count].removed = 1;
566	    }
567	  else
568	    {
569	      if (info->shared
570		  && (((cie.fde_encoding & 0xf0) == DW_EH_PE_absptr
571		       && cie.make_relative == 0)
572		      || (cie.fde_encoding & 0xf0) == DW_EH_PE_aligned))
573		{
574		  /* If a shared library uses absolute pointers
575		     which we cannot turn into PC relative,
576		     don't create the binary search table,
577		     since it is affected by runtime relocations.  */
578		  hdr_info->table = FALSE;
579		}
580	      cie_usage_count++;
581	      hdr_info->fde_count++;
582	    }
583	  if (cie.lsda_encoding != DW_EH_PE_omit)
584	    {
585	      unsigned int dummy;
586
587	      aug = buf;
588	      buf += 2 * get_DW_EH_PE_width (cie.fde_encoding, ptr_size);
589	      if (cie.augmentation[0] == 'z')
590		read_uleb128 (dummy, buf);
591	      /* If some new augmentation data is added before LSDA
592		 in FDE augmentation area, this need to be adjusted.  */
593	      sec_info->entry[sec_info->count].lsda_offset = (buf - aug);
594	    }
595	  buf = last_fde + 4 + hdr.length;
596	  SKIP_RELOCS (buf);
597	}
598
599      sec_info->entry[sec_info->count].fde_encoding = cie.fde_encoding;
600      sec_info->entry[sec_info->count].lsda_encoding = cie.lsda_encoding;
601      sec_info->count++;
602    }
603
604  elf_section_data (sec)->sec_info = sec_info;
605  sec->sec_info_type = ELF_INFO_TYPE_EH_FRAME;
606
607  /* Ok, now we can assign new offsets.  */
608  offset = 0;
609  last_cie_ndx = 0;
610  for (i = 0; i < sec_info->count; i++)
611    {
612      if (! sec_info->entry[i].removed)
613	{
614	  sec_info->entry[i].new_offset = offset;
615	  offset += sec_info->entry[i].size;
616	  if (sec_info->entry[i].cie)
617	    {
618	      last_cie_ndx = i;
619	      make_relative = sec_info->entry[i].make_relative;
620	      make_lsda_relative = sec_info->entry[i].make_lsda_relative;
621	    }
622	  else
623	    {
624	      sec_info->entry[i].make_relative = make_relative;
625	      sec_info->entry[i].make_lsda_relative = make_lsda_relative;
626	      sec_info->entry[i].per_encoding_relative = 0;
627	    }
628	}
629      else if (sec_info->entry[i].cie && sec_info->entry[i].sec == sec)
630	{
631	  /* Need to adjust new_offset too.  */
632	  BFD_ASSERT (sec_info->entry[last_cie_ndx].offset
633		      == sec_info->entry[i].new_offset);
634	  sec_info->entry[i].new_offset
635	    = sec_info->entry[last_cie_ndx].new_offset;
636	}
637    }
638  if (hdr_info->last_cie_sec == sec)
639    {
640      BFD_ASSERT (sec_info->entry[last_cie_ndx].offset
641		  == hdr_info->last_cie_offset);
642      hdr_info->last_cie_offset = sec_info->entry[last_cie_ndx].new_offset;
643    }
644
645  /* FIXME: Currently it is not possible to shrink sections to zero size at
646     this point, so build a fake minimal CIE.  */
647  if (new_size == 0)
648    new_size = 16;
649
650  /* Shrink the sec as needed.  */
651  sec->_cooked_size = new_size;
652  if (sec->_cooked_size == 0)
653    sec->flags |= SEC_EXCLUDE;
654
655  free (ehbuf);
656  return new_size != sec->_raw_size;
657
658free_no_table:
659  if (ehbuf)
660    free (ehbuf);
661  if (sec_info)
662    free (sec_info);
663  hdr_info->table = FALSE;
664  hdr_info->last_cie.hdr.length = 0;
665  return FALSE;
666}
667
668/* This function is called for .eh_frame_hdr section after
669   _bfd_elf_discard_section_eh_frame has been called on all .eh_frame
670   input sections.  It finalizes the size of .eh_frame_hdr section.  */
671
672bfd_boolean
673_bfd_elf_discard_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
674{
675  struct elf_link_hash_table *htab;
676  struct eh_frame_hdr_info *hdr_info;
677  asection *sec;
678
679  htab = elf_hash_table (info);
680  hdr_info = &htab->eh_info;
681  sec = hdr_info->hdr_sec;
682  if (sec == NULL)
683    return FALSE;
684
685  sec->_cooked_size = EH_FRAME_HDR_SIZE;
686  if (hdr_info->table)
687    sec->_cooked_size += 4 + hdr_info->fde_count * 8;
688
689  /* Request program headers to be recalculated.  */
690  elf_tdata (abfd)->program_header_size = 0;
691  elf_tdata (abfd)->eh_frame_hdr = sec;
692  return TRUE;
693}
694
695/* This function is called from size_dynamic_sections.
696   It needs to decide whether .eh_frame_hdr should be output or not,
697   because later on it is too late for calling _bfd_strip_section_from_output,
698   since dynamic symbol table has been sized.  */
699
700bfd_boolean
701_bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *info)
702{
703  asection *o;
704  bfd *abfd;
705  struct elf_link_hash_table *htab;
706  struct eh_frame_hdr_info *hdr_info;
707
708  htab = elf_hash_table (info);
709  hdr_info = &htab->eh_info;
710  if (hdr_info->hdr_sec == NULL)
711    return TRUE;
712
713  if (bfd_is_abs_section (hdr_info->hdr_sec->output_section))
714    {
715      hdr_info->hdr_sec = NULL;
716      return TRUE;
717    }
718
719  abfd = NULL;
720  if (info->eh_frame_hdr)
721    for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
722      {
723	/* Count only sections which have at least a single CIE or FDE.
724	   There cannot be any CIE or FDE <= 8 bytes.  */
725	o = bfd_get_section_by_name (abfd, ".eh_frame");
726	if (o && o->_raw_size > 8 && !bfd_is_abs_section (o->output_section))
727	  break;
728      }
729
730  if (abfd == NULL)
731    {
732      _bfd_strip_section_from_output (info, hdr_info->hdr_sec);
733      hdr_info->hdr_sec = NULL;
734      return TRUE;
735    }
736
737  hdr_info->table = TRUE;
738  return TRUE;
739}
740
741/* Adjust an address in the .eh_frame section.  Given OFFSET within
742   SEC, this returns the new offset in the adjusted .eh_frame section,
743   or -1 if the address refers to a CIE/FDE which has been removed
744   or to offset with dynamic relocation which is no longer needed.  */
745
746bfd_vma
747_bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
748				  asection *sec,
749				  bfd_vma offset)
750{
751  struct eh_frame_sec_info *sec_info;
752  unsigned int lo, hi, mid;
753
754  if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
755    return offset;
756  sec_info = elf_section_data (sec)->sec_info;
757
758  if (offset >= sec->_raw_size)
759    return offset - (sec->_cooked_size - sec->_raw_size);
760
761  lo = 0;
762  hi = sec_info->count;
763  mid = 0;
764  while (lo < hi)
765    {
766      mid = (lo + hi) / 2;
767      if (offset < sec_info->entry[mid].offset)
768	hi = mid;
769      else if (offset
770	       >= sec_info->entry[mid].offset + sec_info->entry[mid].size)
771	lo = mid + 1;
772      else
773	break;
774    }
775
776  BFD_ASSERT (lo < hi);
777
778  /* FDE or CIE was removed.  */
779  if (sec_info->entry[mid].removed)
780    return (bfd_vma) -1;
781
782  /* If converting to DW_EH_PE_pcrel, there will be no need for run-time
783     relocation against FDE's initial_location field.  */
784  if (sec_info->entry[mid].make_relative
785      && ! sec_info->entry[mid].cie
786      && offset == sec_info->entry[mid].offset + 8)
787    return (bfd_vma) -2;
788
789  /* If converting LSDA pointers to DW_EH_PE_pcrel, there will be no need
790     for run-time relocation against LSDA field.  */
791  if (sec_info->entry[mid].make_lsda_relative
792      && ! sec_info->entry[mid].cie
793      && (offset == (sec_info->entry[mid].offset + 8
794		     + sec_info->entry[mid].lsda_offset)))
795    return (bfd_vma) -2;
796
797  return (offset + sec_info->entry[mid].new_offset
798	  - sec_info->entry[mid].offset);
799}
800
801/* Write out .eh_frame section.  This is called with the relocated
802   contents.  */
803
804bfd_boolean
805_bfd_elf_write_section_eh_frame (bfd *abfd,
806				 struct bfd_link_info *info,
807				 asection *sec,
808				 bfd_byte *contents)
809{
810  struct eh_frame_sec_info *sec_info;
811  struct elf_link_hash_table *htab;
812  struct eh_frame_hdr_info *hdr_info;
813  unsigned int i;
814  bfd_byte *p, *buf;
815  unsigned int leb128_tmp;
816  unsigned int cie_offset = 0;
817  unsigned int ptr_size;
818
819  ptr_size = (elf_elfheader (sec->owner)->e_ident[EI_CLASS]
820	      == ELFCLASS64) ? 8 : 4;
821
822  if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
823    return bfd_set_section_contents (abfd, sec->output_section, contents,
824				     sec->output_offset, sec->_raw_size);
825  sec_info = elf_section_data (sec)->sec_info;
826  htab = elf_hash_table (info);
827  hdr_info = &htab->eh_info;
828  if (hdr_info->table && hdr_info->array == NULL)
829    hdr_info->array
830      = bfd_malloc (hdr_info->fde_count * sizeof(*hdr_info->array));
831  if (hdr_info->array == NULL)
832    hdr_info = NULL;
833
834  p = contents;
835  for (i = 0; i < sec_info->count; ++i)
836    {
837      if (sec_info->entry[i].removed)
838	{
839	  if (sec_info->entry[i].cie)
840	    {
841	      /* If CIE is removed due to no remaining FDEs referencing it
842		 and there were no CIEs kept before it, sec_info->entry[i].sec
843		 will be zero.  */
844	      if (sec_info->entry[i].sec == NULL)
845		cie_offset = 0;
846	      else
847		{
848		  cie_offset = sec_info->entry[i].new_offset;
849		  cie_offset += (sec_info->entry[i].sec->output_section->vma
850				 + sec_info->entry[i].sec->output_offset
851				 - sec->output_section->vma
852				 - sec->output_offset);
853		}
854	    }
855	  continue;
856	}
857
858      if (sec_info->entry[i].cie)
859	{
860	  /* CIE */
861	  cie_offset = sec_info->entry[i].new_offset;
862	  if (sec_info->entry[i].make_relative
863	      || sec_info->entry[i].make_lsda_relative
864	      || sec_info->entry[i].per_encoding_relative)
865	    {
866	      unsigned char *aug;
867	      unsigned int action;
868	      unsigned int dummy, per_width, per_encoding;
869
870	      /* Need to find 'R' or 'L' augmentation's argument and modify
871		 DW_EH_PE_* value.  */
872	      action = (sec_info->entry[i].make_relative ? 1 : 0)
873		       | (sec_info->entry[i].make_lsda_relative ? 2 : 0)
874		       | (sec_info->entry[i].per_encoding_relative ? 4 : 0);
875	      buf = contents + sec_info->entry[i].offset;
876	      /* Skip length, id and version.  */
877	      buf += 9;
878	      aug = buf;
879	      buf = strchr (buf, '\0') + 1;
880	      read_uleb128 (dummy, buf);
881	      read_sleb128 (dummy, buf);
882	      read_uleb128 (dummy, buf);
883	      if (*aug == 'z')
884		{
885		  read_uleb128 (dummy, buf);
886		  aug++;
887		}
888
889	      while (action)
890		switch (*aug++)
891		  {
892		  case 'L':
893		    if (action & 2)
894		      {
895			BFD_ASSERT (*buf == sec_info->entry[i].lsda_encoding);
896			*buf |= DW_EH_PE_pcrel;
897			action &= ~2;
898		      }
899		    buf++;
900		    break;
901		  case 'P':
902		    per_encoding = *buf++;
903                    per_width = get_DW_EH_PE_width (per_encoding,
904						    ptr_size);
905		    BFD_ASSERT (per_width != 0);
906		    BFD_ASSERT (((per_encoding & 0x70) == DW_EH_PE_pcrel)
907				== sec_info->entry[i].per_encoding_relative);
908		    if ((per_encoding & 0xf0) == DW_EH_PE_aligned)
909		      buf = (contents
910			     + ((buf - contents + per_width - 1)
911				& ~((bfd_size_type) per_width - 1)));
912		    if (action & 4)
913		      {
914			bfd_vma value;
915
916			value = read_value (abfd, buf, per_width,
917					    get_DW_EH_PE_signed
918					    (per_encoding));
919			value += (sec_info->entry[i].offset
920				  - sec_info->entry[i].new_offset);
921			write_value (abfd, buf, value, per_width);
922			action &= ~4;
923		      }
924		    buf += per_width;
925		    break;
926		  case 'R':
927		    if (action & 1)
928		      {
929			BFD_ASSERT (*buf == sec_info->entry[i].fde_encoding);
930			*buf |= DW_EH_PE_pcrel;
931			action &= ~1;
932		      }
933		    buf++;
934		    break;
935		  default:
936		    BFD_FAIL ();
937		  }
938	    }
939	}
940      else if (sec_info->entry[i].size > 4)
941	{
942	  /* FDE */
943	  bfd_vma value = 0, address;
944	  unsigned int width;
945
946	  buf = contents + sec_info->entry[i].offset;
947	  /* Skip length.  */
948	  buf += 4;
949	  bfd_put_32 (abfd,
950		      sec_info->entry[i].new_offset + 4 - cie_offset, buf);
951	  buf += 4;
952	  width = get_DW_EH_PE_width (sec_info->entry[i].fde_encoding,
953				      ptr_size);
954	  address = value = read_value (abfd, buf, width,
955					get_DW_EH_PE_signed
956					(sec_info->entry[i].fde_encoding));
957	  if (value)
958	    {
959	      switch (sec_info->entry[i].fde_encoding & 0xf0)
960		{
961		case DW_EH_PE_indirect:
962		case DW_EH_PE_textrel:
963		  BFD_ASSERT (hdr_info == NULL);
964		  break;
965		case DW_EH_PE_datarel:
966		  {
967		    asection *got = bfd_get_section_by_name (abfd, ".got");
968
969		    BFD_ASSERT (got != NULL);
970		    address += got->vma;
971		  }
972		  break;
973		case DW_EH_PE_pcrel:
974		  value += (sec_info->entry[i].offset
975			    - sec_info->entry[i].new_offset);
976		  address += (sec->output_section->vma + sec->output_offset
977			      + sec_info->entry[i].offset + 8);
978		  break;
979		}
980	      if (sec_info->entry[i].make_relative)
981		value -= (sec->output_section->vma + sec->output_offset
982			  + sec_info->entry[i].new_offset + 8);
983	      write_value (abfd, buf, value, width);
984	    }
985
986	  if (hdr_info)
987	    {
988	      hdr_info->array[hdr_info->array_count].initial_loc = address;
989	      hdr_info->array[hdr_info->array_count++].fde
990		= (sec->output_section->vma + sec->output_offset
991		   + sec_info->entry[i].new_offset);
992	    }
993
994	  if ((sec_info->entry[i].lsda_encoding & 0xf0) == DW_EH_PE_pcrel
995	      || sec_info->entry[i].make_lsda_relative)
996	    {
997	      buf += sec_info->entry[i].lsda_offset;
998	      width = get_DW_EH_PE_width (sec_info->entry[i].lsda_encoding,
999					  ptr_size);
1000	      value = read_value (abfd, buf, width,
1001				  get_DW_EH_PE_signed
1002				  (sec_info->entry[i].lsda_encoding));
1003	      if (value)
1004		{
1005		  if ((sec_info->entry[i].lsda_encoding & 0xf0)
1006		      == DW_EH_PE_pcrel)
1007		    value += (sec_info->entry[i].offset
1008			      - sec_info->entry[i].new_offset);
1009		  else if (sec_info->entry[i].make_lsda_relative)
1010		    value -= (sec->output_section->vma + sec->output_offset
1011			      + sec_info->entry[i].new_offset + 8
1012			      + sec_info->entry[i].lsda_offset);
1013		  write_value (abfd, buf, value, width);
1014		}
1015	    }
1016	}
1017      else
1018	/* Terminating FDE must be at the end of .eh_frame section only.  */
1019	BFD_ASSERT (i == sec_info->count - 1);
1020
1021      BFD_ASSERT (p == contents + sec_info->entry[i].new_offset);
1022      memmove (p, contents + sec_info->entry[i].offset,
1023	       sec_info->entry[i].size);
1024      p += sec_info->entry[i].size;
1025    }
1026
1027  /* FIXME: Once _bfd_elf_discard_section_eh_frame will be able to
1028     shrink sections to zero size, this won't be needed any more.  */
1029  if (p == contents && sec->_cooked_size == 16)
1030    {
1031      bfd_put_32 (abfd, 12, p);		/* Fake CIE length */
1032      bfd_put_32 (abfd, 0, p + 4);	/* Fake CIE id */
1033      p[8] = 1;				/* Fake CIE version */
1034      memset (p + 9, 0, 7);		/* Fake CIE augmentation, 3xleb128
1035					   and 3xDW_CFA_nop as pad  */
1036      p += 16;
1037    }
1038  else
1039    {
1040      unsigned int alignment = 1 << sec->alignment_power;
1041      unsigned int pad = sec->_cooked_size % alignment;
1042
1043      /* Don't pad beyond the raw size of the output section. It
1044	 can happen at the last input section.  */
1045      if (pad
1046	  && ((sec->output_offset + sec->_cooked_size + pad)
1047	      <= sec->output_section->_raw_size))
1048	{
1049	  /* Find the last CIE/FDE.  */
1050	  for (i = sec_info->count - 1; i > 0; i--)
1051	    if (! sec_info->entry[i].removed)
1052	      break;
1053
1054	  /* The size of the last CIE/FDE must be at least 4.  */
1055	  if (sec_info->entry[i].removed
1056	      || sec_info->entry[i].size < 4)
1057	    abort ();
1058
1059	  pad = alignment - pad;
1060
1061	  buf = contents + sec_info->entry[i].new_offset;
1062
1063	  /* Update length.  */
1064	  sec_info->entry[i].size += pad;
1065	  bfd_put_32 (abfd, sec_info->entry[i].size - 4, buf);
1066
1067	  /* Pad it with DW_CFA_nop  */
1068	  memset (p, 0, pad);
1069	  p += pad;
1070
1071	  sec->_cooked_size += pad;
1072	}
1073    }
1074
1075  BFD_ASSERT ((bfd_size_type) (p - contents) == sec->_cooked_size);
1076
1077  return bfd_set_section_contents (abfd, sec->output_section,
1078                                   contents, (file_ptr) sec->output_offset,
1079                                   sec->_cooked_size);
1080}
1081
1082/* Helper function used to sort .eh_frame_hdr search table by increasing
1083   VMA of FDE initial location.  */
1084
1085static int
1086vma_compare (const void *a, const void *b)
1087{
1088  const struct eh_frame_array_ent *p = a;
1089  const struct eh_frame_array_ent *q = b;
1090  if (p->initial_loc > q->initial_loc)
1091    return 1;
1092  if (p->initial_loc < q->initial_loc)
1093    return -1;
1094  return 0;
1095}
1096
1097/* Write out .eh_frame_hdr section.  This must be called after
1098   _bfd_elf_write_section_eh_frame has been called on all input
1099   .eh_frame sections.
1100   .eh_frame_hdr format:
1101   ubyte version		(currently 1)
1102   ubyte eh_frame_ptr_enc  	(DW_EH_PE_* encoding of pointer to start of
1103				 .eh_frame section)
1104   ubyte fde_count_enc		(DW_EH_PE_* encoding of total FDE count
1105				 number (or DW_EH_PE_omit if there is no
1106				 binary search table computed))
1107   ubyte table_enc		(DW_EH_PE_* encoding of binary search table,
1108				 or DW_EH_PE_omit if not present.
1109				 DW_EH_PE_datarel is using address of
1110				 .eh_frame_hdr section start as base)
1111   [encoded] eh_frame_ptr	(pointer to start of .eh_frame section)
1112   optionally followed by:
1113   [encoded] fde_count		(total number of FDEs in .eh_frame section)
1114   fde_count x [encoded] initial_loc, fde
1115				(array of encoded pairs containing
1116				 FDE initial_location field and FDE address,
1117				 sorted by increasing initial_loc).  */
1118
1119bfd_boolean
1120_bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
1121{
1122  struct elf_link_hash_table *htab;
1123  struct eh_frame_hdr_info *hdr_info;
1124  asection *sec;
1125  bfd_byte *contents;
1126  asection *eh_frame_sec;
1127  bfd_size_type size;
1128  bfd_boolean retval;
1129  bfd_vma encoded_eh_frame;
1130
1131  htab = elf_hash_table (info);
1132  hdr_info = &htab->eh_info;
1133  sec = hdr_info->hdr_sec;
1134  if (sec == NULL)
1135    return TRUE;
1136
1137  size = EH_FRAME_HDR_SIZE;
1138  if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1139    size += 4 + hdr_info->fde_count * 8;
1140  contents = bfd_malloc (size);
1141  if (contents == NULL)
1142    return FALSE;
1143
1144  eh_frame_sec = bfd_get_section_by_name (abfd, ".eh_frame");
1145  if (eh_frame_sec == NULL)
1146    {
1147      free (contents);
1148      return FALSE;
1149    }
1150
1151  memset (contents, 0, EH_FRAME_HDR_SIZE);
1152  contents[0] = 1;				/* Version.  */
1153  contents[1] = get_elf_backend_data (abfd)->elf_backend_encode_eh_address
1154    (abfd, info, eh_frame_sec, 0, sec, 4,
1155     &encoded_eh_frame);			/* .eh_frame offset.  */
1156
1157  if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
1158    {
1159      contents[2] = DW_EH_PE_udata4;		/* FDE count encoding.  */
1160      contents[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4; /* Search table enc.  */
1161    }
1162  else
1163    {
1164      contents[2] = DW_EH_PE_omit;
1165      contents[3] = DW_EH_PE_omit;
1166    }
1167  bfd_put_32 (abfd, encoded_eh_frame, contents + 4);
1168
1169  if (contents[2] != DW_EH_PE_omit)
1170    {
1171      unsigned int i;
1172
1173      bfd_put_32 (abfd, hdr_info->fde_count, contents + EH_FRAME_HDR_SIZE);
1174      qsort (hdr_info->array, hdr_info->fde_count, sizeof (*hdr_info->array),
1175	     vma_compare);
1176      for (i = 0; i < hdr_info->fde_count; i++)
1177	{
1178	  bfd_put_32 (abfd,
1179		      hdr_info->array[i].initial_loc
1180		      - sec->output_section->vma,
1181		      contents + EH_FRAME_HDR_SIZE + i * 8 + 4);
1182	  bfd_put_32 (abfd,
1183		      hdr_info->array[i].fde - sec->output_section->vma,
1184		      contents + EH_FRAME_HDR_SIZE + i * 8 + 8);
1185	}
1186    }
1187
1188  retval = bfd_set_section_contents (abfd, sec->output_section,
1189				     contents, (file_ptr) sec->output_offset,
1190				     sec->_cooked_size);
1191  free (contents);
1192  return retval;
1193}
1194
1195/* Decide whether we can use a PC-relative encoding within the given
1196   EH frame section.  This is the default implementation.  */
1197
1198bfd_boolean
1199_bfd_elf_can_make_relative (bfd *input_bfd ATTRIBUTE_UNUSED,
1200			    struct bfd_link_info *info ATTRIBUTE_UNUSED,
1201			    asection *eh_frame_section ATTRIBUTE_UNUSED)
1202{
1203  return TRUE;
1204}
1205
1206/* Select an encoding for the given address.  Preference is given to
1207   PC-relative addressing modes.  */
1208
1209bfd_byte
1210_bfd_elf_encode_eh_address (bfd *abfd ATTRIBUTE_UNUSED,
1211			    struct bfd_link_info *info ATTRIBUTE_UNUSED,
1212			    asection *osec, bfd_vma offset,
1213			    asection *loc_sec, bfd_vma loc_offset,
1214			    bfd_vma *encoded)
1215{
1216  *encoded = osec->vma + offset -
1217    (loc_sec->output_section->vma + loc_sec->output_offset + loc_offset);
1218  return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
1219}
1220