diff options
Diffstat (limited to 'libsframe')
-rw-r--r-- | libsframe/doc/sframe-spec.texi | 27 | ||||
-rw-r--r-- | libsframe/libsframe.ver | 14 | ||||
-rw-r--r-- | libsframe/libtool-version | 2 | ||||
-rw-r--r-- | libsframe/sframe.c | 42 |
4 files changed, 37 insertions, 48 deletions
diff --git a/libsframe/doc/sframe-spec.texi b/libsframe/doc/sframe-spec.texi index ecc333d..f25791e 100644 --- a/libsframe/doc/sframe-spec.texi +++ b/libsframe/doc/sframe-spec.texi @@ -20,7 +20,7 @@ License''. @titlepage @title The SFrame Format -@subtitle Version 2 +@subtitle Version 2 (Errata 1) @sp 15 @center @today{} @author Indu Bhagat @@ -35,9 +35,9 @@ License''. @node Top @top The SFrame format -This manual describes version 2 of the SFrame file format. SFrame stands for -Simple Frame. The SFrame format keeps track of the minimal necessary -information needed for generating stack traces: +This manual describes version 2 (errata 1) of the SFrame file format. SFrame +stands for Simple Frame. The SFrame format keeps track of the minimal +necessary information needed for generating stack traces: @itemize @minus @item @@ -77,9 +77,10 @@ Appendices @section Overview @cindex Overview -The SFrame stack trace information is provided in a loaded section, known as the -@code{.sframe} section. When available, the @code{.sframe} section appears in -a new segment of its own, PT_GNU_SFRAME. +The SFrame stack trace information is provided in a loaded section, known as +the @code{.sframe} section. When available, the @code{.sframe} section appears +in segment of type PT_GNU_SFRAME. An ELF SFrame section will have the type +SHT_GNU_SFRAME. The SFrame format is currently supported only for select ABIs, namely, AMD64, AAPCS64, and s390x. @@ -129,9 +130,9 @@ the data structure. The above two imply that each SFrame function descriptor entry has a fixed size of 20 bytes instead of its size of 17 bytes in SFrame format version 1. @item -Add a new flag SFRAME_F_FDE_FUNC_START_PCREL, as an erratum to SFrame -Version 2, to indicate the encoding of the SFrame FDE function start address -field: +[Errata 1] Add a new flag SFRAME_F_FDE_FUNC_START_PCREL, as an erratum to +SFrame Version 2, to indicate the encoding of the SFrame FDE function start +address field: @itemize @minus @item if set, @code{sfde_func_start_address} field contains the offset in bytes to the start PC of the associated function from the field itself. @@ -140,8 +141,8 @@ bytes to the start PC of the associated function from the start of the SFrame section. @end itemize @item -Add a new ABI/arch identifier SFRAME_ABI_S390X_ENDIAN_BIG for the s390 -architecture (64-bit) s390x ABI. Other s390x-specific backward compatible +[Errata 1] Add a new ABI/arch identifier SFRAME_ABI_S390X_ENDIAN_BIG for the +s390 architecture (64-bit) s390x ABI. Other s390x-specific backward compatible changes including the following helper definitions have been incrementally added to SFrame version 2 only: @itemize @minus @@ -164,6 +165,8 @@ CFA offset adjustment and then scale down by CFA offset alignment factor). @item SFRAME_V2_S390X_CFA_OFFSET_DECODE: Decode CFA offset (i.e., scale up by CFA offset alignment factor and then revert CFA offset adjustment). @end itemize +@item +[Errata 1] An ELF SFrame section has the type SHT_GNU_SFRAME. @end itemize SFrame version 1 is now obsolete and should not be used. diff --git a/libsframe/libsframe.ver b/libsframe/libsframe.ver index 06324ee..8cc80da 100644 --- a/libsframe/libsframe.ver +++ b/libsframe/libsframe.ver @@ -1,6 +1,6 @@ LIBSFRAME_0.0 { }; -LIBSFRAME_1.0 { +LIBSFRAME_2.0 { global: sframe_decoder_free; sframe_fde_create_func_info; @@ -11,12 +11,13 @@ LIBSFRAME_1.0 { sframe_fre_get_ra_offset; sframe_fre_get_ra_mangled_p; sframe_decode; + sframe_decoder_get_flags; sframe_decoder_get_hdr_size; sframe_decoder_get_abi_arch; sframe_decoder_get_version; + sframe_decoder_get_offsetof_fde_start_addr; sframe_decoder_get_fixed_fp_offset; sframe_decoder_get_fixed_ra_offset; - sframe_get_funcdesc_with_addr; sframe_find_fre; sframe_decoder_get_num_fidx; sframe_decoder_get_funcdesc; @@ -24,9 +25,11 @@ LIBSFRAME_1.0 { sframe_decoder_get_fre; sframe_encode; sframe_encoder_free; + sframe_encoder_get_flags; sframe_encoder_get_hdr_size; sframe_encoder_get_abi_arch; sframe_encoder_get_version; + sframe_encoder_get_offsetof_fde_start_addr; sframe_encoder_get_num_fidx; sframe_encoder_add_fre; sframe_encoder_add_funcdesc; @@ -38,10 +41,3 @@ LIBSFRAME_1.0 { local: *; } LIBSFRAME_0.0; - -LIBSFRAME_1.1 { - sframe_decoder_get_flags; - sframe_decoder_get_offsetof_fde_start_addr; - sframe_encoder_get_flags; - sframe_encoder_get_offsetof_fde_start_addr; -} LIBSFRAME_1.0; diff --git a/libsframe/libtool-version b/libsframe/libtool-version index 9dcbe48..e06835d 100644 --- a/libsframe/libtool-version +++ b/libsframe/libtool-version @@ -27,4 +27,4 @@ # then set age to 0. # # CURRENT:REVISION:AGE -1:0:0 +2:0:0 diff --git a/libsframe/sframe.c b/libsframe/sframe.c index d482d58..824d1fd 100644 --- a/libsframe/sframe.c +++ b/libsframe/sframe.c @@ -876,7 +876,7 @@ sframe_decode_fre (const char *fre_buf, sframe_frame_row_entry *fre, return 0; } -/* Decode the specified SFrame buffer CF_BUF of size CF_SIZE and return the +/* Decode the specified SFrame buffer SF_BUF of size SF_SIZE and return the new SFrame decoder context. Sets ERRP for the caller if any error. Frees up the allocated memory in @@ -1079,18 +1079,6 @@ sframe_decoder_get_offsetof_fde_start_addr (sframe_decoder_ctx *dctx, + offsetof (sframe_func_desc_entry, sfde_func_start_address)); } -/* Find the function descriptor entry which contains the specified address - ADDR. - This function is deprecated and will be removed from libsframe.so.2. */ - -void * -sframe_get_funcdesc_with_addr (sframe_decoder_ctx *ctx __attribute__ ((unused)), - int32_t addr __attribute__ ((unused)), - int *errp) -{ - return sframe_ret_set_errno (errp, SFRAME_ERR_INVAL); -} - /* Find the function descriptor entry starting which contains the specified address ADDR. */ @@ -1340,13 +1328,14 @@ sframe_decoder_get_fre (sframe_decoder_ctx *ctx, if (!sframe_fre_sanity_check_p (&ifre)) return sframe_set_errno (&err, SFRAME_ERR_FRE_INVAL); - sframe_frame_row_entry_copy (fre, &ifre); + /* Although a stricter sanity check on fre_start_addr like: + if (fdep->sfde_func_size) + sframe_assert (frep->fre_start_addr < fdep->sfde_func_size); + is more suitable, some code has been seen to not abide by it. See + PR libsframe/33131. */ + sframe_assert (ifre.fre_start_addr <= fdep->sfde_func_size); - if (fdep->sfde_func_size) - sframe_assert (fre->fre_start_addr < fdep->sfde_func_size); - else - /* A SFrame FDE with func size equal to zero is possible. */ - sframe_assert (fre->fre_start_addr == fdep->sfde_func_size); + sframe_frame_row_entry_copy (fre, &ifre); return 0; } @@ -1599,11 +1588,12 @@ sframe_encoder_add_fre (sframe_encoder_ctx *encoder, = frep->fre_start_addr; ectx_frep->fre_info = frep->fre_info; - if (fdep->sfde_func_size) - sframe_assert (frep->fre_start_addr < fdep->sfde_func_size); - else - /* A SFrame FDE with func size equal to zero is possible. */ - sframe_assert (frep->fre_start_addr == fdep->sfde_func_size); + /* Although a stricter sanity check on fre_start_addr like: + if (fdep->sfde_func_size) + sframe_assert (frep->fre_start_addr < fdep->sfde_func_size); + is more suitable, some code has been seen to not abide by it. See PR + libsframe/33131. */ + sframe_assert (frep->fre_start_addr <= fdep->sfde_func_size); /* frep has already been sanity check'd. Get offsets size. */ offsets_sz = sframe_fre_offset_bytes_size (frep->fre_info); @@ -1639,7 +1629,7 @@ sframe_encoder_add_funcdesc (sframe_encoder_ctx *encoder, int32_t start_addr, uint32_t func_size, unsigned char func_info, - uint32_t num_fres __attribute__ ((unused))) + uint32_t num_fres ATTRIBUTE_UNUSED) { sframe_header *ehp; sf_fde_tbl *fd_info; @@ -1721,7 +1711,7 @@ sframe_encoder_add_funcdesc_v2 (sframe_encoder_ctx *encoder, uint32_t func_size, unsigned char func_info, uint8_t rep_block_size, - uint32_t num_fres __attribute__ ((unused))) + uint32_t num_fres ATTRIBUTE_UNUSED) { sf_fde_tbl *fd_info; int err; |