]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
libsframe: add new dump_sframe_reloc
authorIndu Bhagat <indu.bhagat@oracle.com>
Tue, 4 Feb 2025 19:57:24 +0000 (11:57 -0800)
committerIndu Bhagat <indu.bhagat@oracle.com>
Thu, 6 Feb 2025 15:34:01 +0000 (07:34 -0800)
PR libsframe/32589 - function start address is zero in SFrame section dump

This new function dumps the contents of a relocated SFrame section in
human readable text.

Even after the section contents are relocated, there is need to fixup
the function start address, which is what sframe_fde_tbl_reloc_fixup ()
is about.  This function is libsframe internal only and is not exposed.

Some caution is necessary though in making sure this is done in a
version aware manner, when future versions of the SFrame format are
implemented.

libsframe/
        * libtool.version: Bump revision and age.  Use 1:1:1.
        * libsframe.ver: Add new API dump_sframe_reloc.
        * sframe-dump.c (dump_sframe):
        (dump_sframe_reloc): New definition.
        * sframe-impl.h (sframe_fde_tbl_reloc_fixup): New declaration.
        * sframe.c (sframe_fde_tbl_reloc_fixup): New definition.

include/
        * sframe-api.h (dump_sframe_reloc): New declaration.

include/sframe-api.h
libsframe/libsframe.ver
libsframe/libtool-version
libsframe/sframe-dump.c
libsframe/sframe-impl.h
libsframe/sframe.c

index 77ba32b0f4b90f52107bd0f9fd19f959ae22f493..a2527ec4a3e953eafe2417832bda60a92b7a4af3 100644 (file)
@@ -189,6 +189,10 @@ sframe_decoder_get_funcdesc_v2 (sframe_decoder_ctx *ctx,
 extern void
 dump_sframe (sframe_decoder_ctx *decoder, uint64_t addr);
 
+/* SFrame textual dump - with relocation.  */
+extern void
+dump_sframe_reloc (sframe_decoder_ctx *dctx, uint64_t sec_addr, bool relocate);
+
 /* Get the base reg id from the FRE info.  Sets errp if fails.  */
 extern uint8_t
 sframe_fre_get_base_reg_id (sframe_frame_row_entry *fre, int *errp);
index 57f5fb6c3786ec6cc6496871efcd4210048e0e37..1f794134679f9c1ff662a8175c4bdb82e8f444bc 100644 (file)
@@ -33,6 +33,7 @@ LIBSFRAME_1.0 {
     sframe_encoder_add_funcdesc_v2;
     sframe_encoder_write;
     dump_sframe;
+    dump_sframe_reloc;
     sframe_errmsg;
 
   local:
index 9dcbe48e47dd5dd46da86ceb978ff9cbfb06c3e0..6fe45c485c59a57872dde9ffc81d454a67bdf297 100644 (file)
@@ -27,4 +27,4 @@
 #       then set age to 0.
 #
 # CURRENT:REVISION:AGE
-1:0:0
+1:1:1
index 1fa508d9bad2029a5e416581d8cad738ed544925..95c4d44414ee7fb01e93ebd570eddec4394e174c 100644 (file)
@@ -219,13 +219,20 @@ dump_sframe_functions (sframe_decoder_ctx *sfd_ctx, uint64_t sec_addr)
 }
 
 void
-dump_sframe (sframe_decoder_ctx *sfd_ctx, uint64_t sec_addr)
+dump_sframe_reloc (sframe_decoder_ctx *sfd_ctx, uint64_t sec_addr, bool relocate)
 {
-  uint8_t ver;
+  if (relocate)
+    sframe_fde_tbl_reloc_fixup (sfd_ctx);
+
+  dump_sframe (sfd_ctx, sec_addr);
+}
 
+void
+dump_sframe (sframe_decoder_ctx *sfd_ctx, uint64_t sec_addr)
+{
   dump_sframe_header (sfd_ctx);
 
-  ver = sframe_decoder_get_version (sfd_ctx);
+  uint8_t ver = sframe_decoder_get_version (sfd_ctx);
   if (ver == SFRAME_VERSION)
     dump_sframe_functions (sfd_ctx, sec_addr);
   else
index 1cada54ae9ee38a7f6b6098a0c04966823d664ae..9887039c3c5f18b30eaba7ca5d74fdd6117cdd6b 100644 (file)
@@ -64,6 +64,8 @@ struct sframe_encoder_ctx
   size_t sfe_data_size;
 };
 
+int sframe_fde_tbl_reloc_fixup (sframe_decoder_ctx *dctx);
+
 #ifdef  __cplusplus
 }
 #endif
index c2693b978ec3992e99540877107db0ba9aa8a512..ebf8019b78bbde5eb85e7a6e7af04054eb46fae9 100644 (file)
@@ -102,6 +102,37 @@ sframe_ret_set_errno (int *errp, int error)
   return NULL;
 }
 
+/* If the input buffer containing the SFrame section has been relocated, there
+   will be a need to do fixups too.  The fixup merely accounts for the offset
+   of the byte from the start of the section.
+
+   Currently used by dump_sframe.  The caller must have decoded (and hence,
+   endian flipped) the input buffer before calling this function.  */
+
+int
+sframe_fde_tbl_reloc_fixup (sframe_decoder_ctx *dctx)
+{
+  uint8_t sframe_ver = sframe_decoder_get_version (dctx);
+  uint32_t num_fdes = sframe_decoder_get_num_fidx (dctx);
+  unsigned int buf_offset = 0;
+  sframe_func_desc_entry *fde;
+  uint32_t i = 0;
+
+  if (sframe_ver != SFRAME_VERSION_2 || !dctx->sfd_funcdesc)
+    return SFRAME_ERR;
+
+  buf_offset += sframe_decoder_get_hdr_size (dctx);
+  while (i < num_fdes)
+    {
+      fde = &dctx->sfd_funcdesc[i];
+      fde->sfde_func_start_address += buf_offset;
+      buf_offset += sizeof (sframe_func_desc_entry);
+      i++;
+    }
+
+  return 0;
+}
+
 /* Get the SFrame header size.  */
 
 static uint32_t