forked from Imagelibrary/binutils-gdb
libsframe asan: avoid generating misaligned loads
There are two places where unaligned loads were seen on aarch64: - #1. access to the SFrame FRE stack offsets in the in-memory representation/abstraction provided by libsframe. - #2. access to the SFrame FRE start address in the on-disk representation of the frame row entry. For #1, we can fix this by reordering the struct members of sframe_frame_row_entry in libsframe/sframe-api.h. For #2, we need to default to using memcpy instead, and copy out the bytes to a location for output. SFrame format is an unaligned on-disk format. As such, there are other blobs of memory in the on-disk SFrame FRE that are on not on their natural boundaries. But that does not pose further problems yet, because the users are provided access to the on-disk SFrame FRE data via libsframe's sframe_frame_row_entry, the latter has its' struct members aligned on their respective natural boundaries (and initialized using memcpy). PR 29856 libsframe asan: load misaligned at sframe.c:516 ChangeLog: PR libsframe/29856 * bfd/elf64-x86-64.c: Adjust as the struct members have been reordered. * libsframe/sframe.c (sframe_decode_fre_start_address): Use memcpy to perform 16-bit/32-bit reads. * libsframe/testsuite/libsframe.encode/encode-1.c: Adjust as the struct members have been reordered. include/ChangeLog: PR libsframe/29856 * sframe-api.h: Reorder fre_offsets for natural alignment.
This commit is contained in:
@@ -33,10 +33,10 @@ add_fde1 (sframe_encoder_ctx *encode, int idx)
|
||||
int i, err;
|
||||
/* A contiguous block containing 4 FREs. */
|
||||
sframe_frame_row_entry fres[]
|
||||
= { {0x0, 0x3, {0x8, 0, 0}},
|
||||
{0x1, 0x5, {0x10, 0xf0, 0}},
|
||||
{0x4, 0x4, {0x10, 0xf0, 0}},
|
||||
{0x1a, 0x5, {0x8, 0xf0, 0}}
|
||||
= { {0x0, {0x8, 0, 0}, 0x3},
|
||||
{0x1, {0x10, 0xf0, 0}, 0x5},
|
||||
{0x4, {0x10, 0xf0, 0}, 0x4},
|
||||
{0x1a, {0x8, 0xf0, 0}, 0x5}
|
||||
};
|
||||
|
||||
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
|
||||
@@ -58,10 +58,10 @@ add_fde2 (sframe_encoder_ctx *encode, int idx)
|
||||
int i, err;
|
||||
/* A contiguous block containing 4 FREs. */
|
||||
sframe_frame_row_entry fres[]
|
||||
= { {0x0, 0x3, {0x8, 0, 0}},
|
||||
{0x1, 0x5, {0x10, 0xf0, 0}},
|
||||
{0x4, 0x4, {0x10, 0xf0, 0}},
|
||||
{0xf, 0x5, {0x8, 0xf0, 0}}
|
||||
= { {0x0, {0x8, 0, 0}, 0x3},
|
||||
{0x1, {0x10, 0xf0, 0}, 0x5},
|
||||
{0x4, {0x10, 0xf0, 0}, 0x4},
|
||||
{0xf, {0x8, 0xf0, 0}, 0x5}
|
||||
};
|
||||
|
||||
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
|
||||
|
||||
Reference in New Issue
Block a user