Skip to content

Commit

Permalink
exe-elf: word-align trampoline code
Browse files Browse the repository at this point in the history
Thumb is a halfword-aligned instruction set encoding, but our trampoline
code uses a PC-relative jump, which needs to be positioned on a word
aligned address.
  • Loading branch information
MrAnno committed Jan 3, 2022
1 parent dbf930f commit b688d20
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 5 deletions.
18 changes: 17 additions & 1 deletion src/exe-elf-arm-fixup.h
Expand Up @@ -29,10 +29,16 @@
#include <stdint.h>
#include <string.h>

#include "common.h"
#include "exe-elf.h"

extern void *bxfi_trampoline_thumb;
extern void *bxfi_trampoline_thumb_addr;
extern void *bxfi_trampoline_thumb_end;

extern void *bxfi_trampoline_thumb_nop;
extern void *bxfi_trampoline_thumb_nop_end;

static inline int bxfi_exe_is_arm_thumb_func(void *func_addr)
{
return (uintptr_t) func_addr & 0x1U;
Expand All @@ -44,6 +50,11 @@ static inline void bxfi_exe_fix_func_addr_if_in_arm_thumb_mode(void **addr)
*addr = (void *) (uintptr_t) ((uintptr_t) *addr & ~0x1ULL);
}

static inline int bxfi_exe_is_arm_func_word_aligned(void *func_addr)
{
return ((uintptr_t) func_addr & 0x3U) == 0;
}

static inline void bxfi_exe_trampoline_fixup(void **func_to_patch, void **trampoline,
void **trampoline_end, void **trampoline_addr)
{
Expand All @@ -58,7 +69,12 @@ static inline void bxfi_exe_trampoline_fixup(void **func_to_patch, void **trampo

static inline size_t bxfi_exe_inject_prelude(void *func_to_patch)
{
return 0;
if (bxfi_exe_is_arm_func_word_aligned(func_to_patch))
return 0;

size_t nop_len = BXFI_TRAMPOLINE_SIZE(&bxfi_trampoline_thumb_nop, &bxfi_trampoline_thumb_nop_end);
memcpy(nonstd (void *) func_to_patch, &bxfi_trampoline_thumb_nop, nop_len);
return nop_len;
}

#endif /* !EXE_ELF_ARM_FIXUP_H_ */
5 changes: 1 addition & 4 deletions src/exe-elf.c
Expand Up @@ -29,6 +29,7 @@

#include "config.h"
#include "exe.h"
#include "exe-elf.h"
#include "addr.h"
#include "common.h"

Expand Down Expand Up @@ -158,10 +159,6 @@ extern void *bxfi_trampoline;
extern void *bxfi_trampoline_addr;
extern void *bxfi_trampoline_end;

#define BXFI_TRAMPOLINE_SIZE(Start, End) \
((uintptr_t) End \
- (uintptr_t) Start)

int bxfi_exe_patch_main(bxfi_exe_fn *new_main)
{
void *addr = nonstd (void *) &main;
Expand Down
4 changes: 4 additions & 0 deletions src/exe-elf.h
Expand Up @@ -33,6 +33,10 @@
# define ElfW__(e, t) e ## t
#endif

#define BXFI_TRAMPOLINE_SIZE(Start, End) \
((uintptr_t) End \
- (uintptr_t) Start)

typedef struct link_map *bxfi_exe_lib;
typedef struct r_debug *bxfi_exe_ctx;
typedef void (bxfi_exe_fn)(void);
Expand Down

0 comments on commit b688d20

Please sign in to comment.