summaryrefslogtreecommitdiffstats
path: root/libebl/eblinitreg.c
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2014-06-14 17:15:37 +0200
committerMark Wielaard <[email protected]>2014-06-22 13:47:48 +0200
commitc1c1c06e30f0b3b4ae66fcfec6318a93b8f31569 (patch)
treee5b811236c230f2ea82749f0ad9c2c4ac1bcf396 /libebl/eblinitreg.c
parentba9e5156207e3c2bb85adc747376e774af3c0df6 (diff)
libebl: Add ebl_func_addr_mask plus ARM backend implementation.
The ARM EABI says that the zero bit of function symbol st_value indicates whether the symbol points to a THUMB or ARM function. Also the return value address in an unwind will contain the same extra bit to indicate whether to return to a regular ARM or THUMB function. Add a new ebl function to mask off such bits and turn a function value into a function address so that we get the actual value that a function symbol or return address points to. It isn't easily possible to reuse the existing ebl_resolve_sym_value for this purpose, so we end up with another hook that can be used from dwfl_module_getsym, handle_cfi and elflint. Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'libebl/eblinitreg.c')
-rw-r--r--libebl/eblinitreg.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/libebl/eblinitreg.c b/libebl/eblinitreg.c
index 8909c500..5729b3cc 100644
--- a/libebl/eblinitreg.c
+++ b/libebl/eblinitreg.c
@@ -1,5 +1,5 @@
/* Fetch live process Dwfl_Frame from PID.
- Copyright (C) 2013 Red Hat, Inc.
+ Copyright (C) 2013, 2014 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -49,3 +49,10 @@ ebl_frame_nregs (Ebl *ebl)
{
return ebl == NULL ? 0 : ebl->frame_nregs;
}
+
+GElf_Addr
+ebl_func_addr_mask (Ebl *ebl)
+{
+ return ((ebl == NULL || ebl->func_addr_mask == 0)
+ ? ~(GElf_Addr)0 : ebl->func_addr_mask);
+}