diff options
| author | Mark Wielaard <[email protected]> | 2014-06-14 17:15:37 +0200 |
|---|---|---|
| committer | Mark Wielaard <[email protected]> | 2014-06-22 13:47:48 +0200 |
| commit | c1c1c06e30f0b3b4ae66fcfec6318a93b8f31569 (patch) | |
| tree | e5b811236c230f2ea82749f0ad9c2c4ac1bcf396 /libebl/eblinitreg.c | |
| parent | ba9e5156207e3c2bb85adc747376e774af3c0df6 (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.c | 9 |
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); +} |
