public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Support multiple .eh_frame sections
@ 2022-07-29  7:48 Jojo R
  2022-08-01 11:10 ` Nick Clifton
  2022-11-02  8:01 ` [PATCH v2] " Jojo R
  0 siblings, 2 replies; 10+ messages in thread
From: Jojo R @ 2022-07-29  7:48 UTC (permalink / raw)
  To: rjiejie, binutils

	This patch is based on MULTIPLE_FRAME_SECTIONS and EH_FRAME_LINKONCE,
	it allows backend to enable this feature and use '--gc-sections' simply.

	* gas/dw2gencfi.h (TARGET_MULTIPLE_EH_FRAME_SECTIONS): New.
	(MULTIPLE_FRAME_SECTIONS): Add TARGET_MULTIPLE_EH_FRAME_SECTIONS.
	* gas/dw2gencfi.c (EH_FRAME_LINKONCE): Add TARGET_MULTIPLE_EH_FRAME_SECTIONS.
	(is_now_linkonce_segment): Likewise.
	(get_cfi_seg): Create relocation info between .eh_frame.* and .text.* section.

	* bfd/elf-bfd.h (elf_backend_can_make_multiple_eh_frame): New.
	* bfd/elfxx-target.h (elf_backend_can_make_multiple_eh_frame): Likewise.
	* bfd/elflink.c (_bfd_elf_default_action_discarded): Add checking for
	elf_backend_can_make_multiple_eh_frame.
---
 bfd/elf-bfd.h      |  3 +++
 bfd/elflink.c      |  7 +++++++
 bfd/elfxx-target.h |  4 ++++
 gas/dw2gencfi.c    | 27 +++++++++++++++++++++++++--
 gas/dw2gencfi.h    |  7 ++++++-
 5 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 65bd1128263..f9b64faa080 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -1432,6 +1432,9 @@ struct elf_backend_data
   bool (*elf_backend_can_make_lsda_relative_eh_frame)
      (bfd *, struct bfd_link_info *, asection *);
 
+  /* Tell linker to support multiple eh_frame sections.  */
+  bool elf_backend_can_make_multiple_eh_frame;
+
   /* This function returns an encoding after computing the encoded
      value (and storing it in ENCODED) for the given OFFSET into OSEC,
      to be stored in at LOC_OFFSET into the LOC_SEC input section.
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 2b1450fa4e1..395718d72a6 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -10924,6 +10924,13 @@ elf_section_ignore_discarded_relocs (asection *sec)
 unsigned int
 _bfd_elf_default_action_discarded (asection *sec)
 {
+  const struct elf_backend_data *bed;
+  bed = get_elf_backend_data (sec->owner);
+
+  if (bed->elf_backend_can_make_multiple_eh_frame
+      && strncmp (sec->name, ".eh_frame.", 10) == 0)
+    return 0;
+
   if (sec->flags & SEC_DEBUGGING)
     return PRETEND;
 
diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h
index 0579f64d1a0..3927a377a0e 100644
--- a/bfd/elfxx-target.h
+++ b/bfd/elfxx-target.h
@@ -654,6 +654,9 @@
 #ifndef elf_backend_can_make_lsda_relative_eh_frame
 #define elf_backend_can_make_lsda_relative_eh_frame	_bfd_elf_can_make_relative
 #endif
+#ifndef elf_backend_can_make_multiple_eh_frame
+#define elf_backend_can_make_multiple_eh_frame 0
+#endif
 #ifndef elf_backend_encode_eh_address
 #define elf_backend_encode_eh_address		_bfd_elf_encode_eh_address
 #endif
@@ -887,6 +890,7 @@ static const struct elf_backend_data elfNN_bed =
   elf_backend_eh_frame_address_size,
   elf_backend_can_make_relative_eh_frame,
   elf_backend_can_make_lsda_relative_eh_frame,
+  elf_backend_can_make_multiple_eh_frame,
   elf_backend_encode_eh_address,
   elf_backend_write_section,
   elf_backend_elfsym_local_is_section,
diff --git a/gas/dw2gencfi.c b/gas/dw2gencfi.c
index 6be8cb50495..461ab601321 100644
--- a/gas/dw2gencfi.c
+++ b/gas/dw2gencfi.c
@@ -75,7 +75,8 @@
 # define tc_cfi_endproc(fde) ((void) (fde))
 #endif
 
-#define EH_FRAME_LINKONCE (SUPPORT_FRAME_LINKONCE || compact_eh)
+#define EH_FRAME_LINKONCE (SUPPORT_FRAME_LINKONCE || compact_eh \
+			   || TARGET_MULTIPLE_EH_FRAME_SECTIONS)
 
 #ifndef DWARF2_FORMAT
 #define DWARF2_FORMAT(SEC) dwarf2_format_32bit
@@ -277,6 +278,9 @@ is_now_linkonce_segment (void)
   if (compact_eh)
     return now_seg;
 
+  if (TARGET_MULTIPLE_EH_FRAME_SECTIONS)
+    return now_seg;
+
   if ((bfd_section_flags (now_seg)
        & (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
 	  | SEC_LINK_DUPLICATES_ONE_ONLY | SEC_LINK_DUPLICATES_SAME_SIZE
@@ -1333,14 +1337,33 @@ static segT
 get_cfi_seg (segT cseg, const char *base, flagword flags, int align)
 {
   /* Exclude .debug_frame sections for Compact EH.  */
-  if (SUPPORT_FRAME_LINKONCE || ((flags & SEC_DEBUGGING) == 0 && compact_eh))
+  if (SUPPORT_FRAME_LINKONCE || ((flags & SEC_DEBUGGING) == 0 && compact_eh)
+      || ((flags & SEC_DEBUGGING) == 0 && TARGET_MULTIPLE_EH_FRAME_SECTIONS))
     {
+      segT iseg = cseg;
       struct dwcfi_seg_list *l;
 
       l = dwcfi_hash_find_or_make (cseg, base, flags);
 
       cseg = l->seg;
       subseg_set (cseg, l->subseg);
+
+      if (TARGET_MULTIPLE_EH_FRAME_SECTIONS
+	  && (flags & DWARF2_EH_FRAME_READ_ONLY))
+	{
+	  const frchainS *ifrch = seg_info (iseg)->frchainP;
+	  const frchainS *frch = seg_info (cseg)->frchainP;
+	  expressionS exp;
+
+	  exp.X_op = O_symbol;
+	  exp.X_add_symbol = (symbolS *) local_symbol_make (cseg->name, cseg, 0, frch->frch_root);;
+	  exp.X_add_number = 0;
+	  subseg_set (iseg, ifrch->frch_subseg);
+	  fix_new_exp (ifrch->frch_root, 0, 0, &exp, 0, BFD_RELOC_NONE);
+
+	  /* Restore the original segment info.  */
+	  subseg_set (cseg, l->subseg);
+	}
     }
   else
     {
diff --git a/gas/dw2gencfi.h b/gas/dw2gencfi.h
index d570cdb8db3..0f5ae77d800 100644
--- a/gas/dw2gencfi.h
+++ b/gas/dw2gencfi.h
@@ -66,7 +66,12 @@ extern void cfi_add_CFA_restore_state (void);
 #define SUPPORT_COMPACT_EH 0
 #endif
 
-#define MULTIPLE_FRAME_SECTIONS (SUPPORT_FRAME_LINKONCE || SUPPORT_COMPACT_EH)
+#ifndef TARGET_MULTIPLE_EH_FRAME_SECTIONS
+#define TARGET_MULTIPLE_EH_FRAME_SECTIONS 0
+#endif
+
+#define MULTIPLE_FRAME_SECTIONS (SUPPORT_FRAME_LINKONCE || SUPPORT_COMPACT_EH \
+				 || TARGET_MULTIPLE_EH_FRAME_SECTIONS)
 
 struct cfi_insn_data
 {
-- 
2.17.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2022-11-04  1:50 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-29  7:48 [PATCH] Support multiple .eh_frame sections Jojo R
2022-08-01 11:10 ` Nick Clifton
2022-08-02  7:23   ` Jojo R
2022-11-02  8:01 ` [PATCH v2] " Jojo R
2022-11-02 12:21   ` Nick Clifton
2022-11-03  2:11     ` Jojo R
2022-11-03  2:04   ` [PATCH v3] " Jojo R
2022-11-03 10:26     ` Nick Clifton
2022-11-03 19:34       ` Fangrui Song
     [not found]       ` <DS7PR12MB57653A2E86C6779B24889E51CB389@DS7PR12MB5765.namprd12.prod.outlook.com>
2022-11-04  1:50         ` Jojo R

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).