From d7b37ebf0a890aff1d5b2c5448711a898fc84930 Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Thu, 13 Dec 2001 11:09:33 +0000
Subject: [PATCH] 	* elf-bfd.h (enum elf_link_info_type): New. 
 (struct bfd_elf_section_data): Remove stab_info and merge_info 
 fields, add sec_info and sec_info_type. 	(struct elf_obj_tdata): Add
 eh_frame_hdr field. 	(_bfd_elf_discard_section_eh_frame): New prototype. 
 (_bfd_elf_discard_section_eh_frame_hdr): Likewise. 
 (_bfd_elf_eh_frame_section_offset): Likewise. 
 (_bfd_elf_write_section_eh_frame): Likewise. 
 (_bfd_elf_write_section_eh_frame_hdr): Likewise. 	* Makefile.am
 (BFD32_BACKENDS): Add elf-eh-frame.lo. 	(BFD32_BACKENDS_CFILES): Add
 elf-eh-frame.c. 	(elf-eh-frame.lo): New. 	* Makefile.in:
 Rebuilt. 	* configure.in (elf): Add elf-eh-frame.lo. 	* configure:
 Rebuilt. 	* elf.c (_bfd_elf_print_private_bfd_data): Support
 PT_GNU_EH_FRAME. 	(map_sections_to_segments): Create PT_GNU_EH_FRAME if
 requested. 	(get_program_header_size): Take into account PT_GNU_EH_FRAME 
 segment. 	(_bfd_elf_rela_local_sym): Use sec_info_type and sec_info. 
 (_bfd_elf_rel_local_sym): Likewise. 	(_bfd_elf_section_offset): Likewise. 
 Call 	_bfd_elf_eh_frame_section_offset too. 	* elfxx-ia64.c
 (elfNN_ia64_relocate_section): Use sec_info_type and 	sec_info. 	*
 elf64-alpha.c (elf64_alpha_relocate_section): Likewise. 	*
 elf-eh-frame.c: New file. 	* elflink.h (elf_link_add_object_symbols):
 Don't optimize SHF_MERGE 	.stab sections.  Set sec_info_type, use
 sec_info instead 	of merge_info and stab_info. 
 (elf_link_create_dynamic_sections): Create .eh_frame_hdr section 	if
 --eh-frame-hdr. 	(elf_bfd_final_link): Write .eh_frame_hdr section. 
 (elf_link_sec_merge_syms): Use sec_info_type and sec_info. 
 (elf_link_input_bfd): Likewise. 	Call _bfd_elf_write_section_eh_frame
 to write .eh_frame sections. 	(elf_bfd_discard_info): Add output_bfd
 argument. 	Call _bfd_elf_discard_section_eh_frame and 
 _bfd_elf_discard_section_eh_frame_hdr. 
 (elf_section_ignore_discarded_relocs): Use sec_info_type, not section 	names.
 	* bfd-in.h (bfd_elf32_discard_info, bfd_elf64_discard_info): Adjust 
 prototypes. 	* bfd-in2.h (bfd_elf32_discard_info, bfd_elf64_discard_info):
 Likewise.

	* elf/common.h (PT_GNU_EH_FRAME): Define.
	* bfdlink.h (struct bfd_link_info): Add eh_frame_hdr field.

	* emultempl/elf32.em (finish): Supply output_bfd
	to bfd_elf*_discard_info.
	(OPTION_EH_FRAME_HDR): Define.
	(longopts): Add --eh-frame-hdr.
	(parse_args): Handle it.
	(list_options): Add --eh-frame-hdr to help.
	* emultempl/hppaelf.em (finish): Supply output_bfd
	to bfd_elf*_discard_info.
	* scripttempl/elf.sc (.eh_frame_hdr): Add.

	* readelf.c (get_segment_type): Support PT_GNU_EH_FRAME.
---
 include/ChangeLog    | 5 +++++
 include/bfdlink.h    | 4 ++++
 include/elf/common.h | 2 ++
 3 files changed, 11 insertions(+)

diff --git a/include/ChangeLog b/include/ChangeLog
index 5a13fee45..2313517e4 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,8 @@
+2001-12-13  Jakub Jelinek  <jakub@redhat.com>
+
+	* elf/common.h (PT_GNU_EH_FRAME): Define.
+	* bfdlink.h (struct bfd_link_info): Add eh_frame_hdr field.
+
 2001-12-07  Geoffrey Keating  <geoffk@redhat.com>
 
 	* dis-asm.h (print_insn_xstormy16): Declare.
diff --git a/include/bfdlink.h b/include/bfdlink.h
index 086559438..c02a1e820 100644
--- a/include/bfdlink.h
+++ b/include/bfdlink.h
@@ -298,6 +298,10 @@ struct bfd_link_info
      Setting this true may result in a non-sharable text segment.  */
   boolean nocopyreloc;
 
+  /* True if .eh_frame_hdr section and PT_GNU_EH_FRAME ELF segment
+     should be created.  */
+  boolean eh_frame_hdr;
+
   /* How many spare .dynamic DT_NULL entries should be added?  */
   unsigned int spare_dynamic_tags;
 };
diff --git a/include/elf/common.h b/include/elf/common.h
index 1c25f9ff3..36a0b4dd8 100644
--- a/include/elf/common.h
+++ b/include/elf/common.h
@@ -256,6 +256,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define PT_LOPROC	0x70000000	/* Processor-specific */
 #define PT_HIPROC	0x7FFFFFFF	/* Processor-specific */
 
+#define PT_GNU_EH_FRAME	(PT_LOOS + 0x474e550)
+
 /* Program segment permissions, in program header p_flags field.  */
 
 #define PF_X		(1 << 0)	/* Segment is executable */