objtool: Add annotype() helper
... for reading annotation types. Acked-by: Petr Mladek <pmladek@suse.com> Tested-by: Joe Lawrence <joe.lawrence@redhat.com> Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>pull/1354/merge
parent
03c19a99ee
commit
3b92486fa1
|
|
@ -5,7 +5,6 @@
|
|||
#include <objtool/check.h>
|
||||
#include <objtool/orc.h>
|
||||
#include <objtool/warn.h>
|
||||
#include <objtool/endianness.h>
|
||||
|
||||
int init_orc_entry(struct orc_entry *orc, struct cfi_state *cfi, struct instruction *insn)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
#include <objtool/arch.h>
|
||||
#include <objtool/warn.h>
|
||||
#include <objtool/builtin.h>
|
||||
#include <objtool/endianness.h>
|
||||
|
||||
int arch_ftrace_match(const char *name)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@
|
|||
#include <objtool/elf.h>
|
||||
#include <objtool/arch.h>
|
||||
#include <objtool/warn.h>
|
||||
#include <objtool/endianness.h>
|
||||
#include <objtool/builtin.h>
|
||||
#include <arch/elf.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@
|
|||
#include <objtool/check.h>
|
||||
#include <objtool/orc.h>
|
||||
#include <objtool/warn.h>
|
||||
#include <objtool/endianness.h>
|
||||
|
||||
int init_orc_entry(struct orc_entry *orc, struct cfi_state *cfi, struct instruction *insn)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@
|
|||
#include <objtool/check.h>
|
||||
#include <objtool/special.h>
|
||||
#include <objtool/warn.h>
|
||||
#include <objtool/endianness.h>
|
||||
|
||||
#include <linux/objtool_types.h>
|
||||
#include <linux/hashtable.h>
|
||||
|
|
@ -2273,9 +2272,7 @@ static int read_annotate(struct objtool_file *file,
|
|||
}
|
||||
|
||||
for_each_reloc(sec->rsec, reloc) {
|
||||
type = *(u32 *)(sec->data->d_buf + (reloc_idx(reloc) * sec->sh.sh_entsize) + 4);
|
||||
type = bswap_if_needed(file->elf, type);
|
||||
|
||||
type = annotype(file->elf, sec, reloc);
|
||||
offset = reloc->sym->offset + reloc_addend(reloc);
|
||||
insn = find_insn(file, reloc->sym->sec, offset);
|
||||
|
||||
|
|
|
|||
|
|
@ -13,10 +13,14 @@
|
|||
#include <linux/hashtable.h>
|
||||
#include <linux/rbtree.h>
|
||||
#include <linux/jhash.h>
|
||||
|
||||
#include <objtool/endianness.h>
|
||||
#include <arch/elf.h>
|
||||
|
||||
#define SYM_NAME_LEN 512
|
||||
|
||||
#define bswap_if_needed(elf, val) __bswap_if_needed(&elf->ehdr, val)
|
||||
|
||||
#ifdef LIBELF_USE_DEPRECATED
|
||||
# define elf_getshdrnum elf_getshnum
|
||||
# define elf_getshdrstrndx elf_getshstrndx
|
||||
|
|
@ -401,6 +405,15 @@ static inline void set_reloc_type(struct elf *elf, struct reloc *reloc, unsigned
|
|||
mark_sec_changed(elf, reloc->sec, true);
|
||||
}
|
||||
|
||||
static inline unsigned int annotype(struct elf *elf, struct section *sec,
|
||||
struct reloc *reloc)
|
||||
{
|
||||
unsigned int type;
|
||||
|
||||
type = *(u32 *)(sec->data->d_buf + (reloc_idx(reloc) * 8) + 4);
|
||||
return bswap_if_needed(elf, type);
|
||||
}
|
||||
|
||||
#define RELOC_JUMP_TABLE_BIT 1UL
|
||||
|
||||
/* Does reloc mark the beginning of a jump table? */
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <endian.h>
|
||||
#include <objtool/elf.h>
|
||||
|
||||
/*
|
||||
* Does a byte swap if target file endianness doesn't match the host, i.e. cross
|
||||
|
|
@ -12,16 +11,16 @@
|
|||
* To be used for multi-byte values conversion, which are read from / about
|
||||
* to be written to a target native endianness ELF file.
|
||||
*/
|
||||
static inline bool need_bswap(struct elf *elf)
|
||||
static inline bool need_bswap(GElf_Ehdr *ehdr)
|
||||
{
|
||||
return (__BYTE_ORDER == __LITTLE_ENDIAN) ^
|
||||
(elf->ehdr.e_ident[EI_DATA] == ELFDATA2LSB);
|
||||
(ehdr->e_ident[EI_DATA] == ELFDATA2LSB);
|
||||
}
|
||||
|
||||
#define bswap_if_needed(elf, val) \
|
||||
#define __bswap_if_needed(ehdr, val) \
|
||||
({ \
|
||||
__typeof__(val) __ret; \
|
||||
bool __need_bswap = need_bswap(elf); \
|
||||
bool __need_bswap = need_bswap(ehdr); \
|
||||
switch (sizeof(val)) { \
|
||||
case 8: \
|
||||
__ret = __need_bswap ? bswap_64(val) : (val); break; \
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
#include <objtool/objtool.h>
|
||||
#include <objtool/orc.h>
|
||||
#include <objtool/warn.h>
|
||||
#include <objtool/endianness.h>
|
||||
|
||||
int orc_dump(const char *filename)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@
|
|||
#include <objtool/check.h>
|
||||
#include <objtool/orc.h>
|
||||
#include <objtool/warn.h>
|
||||
#include <objtool/endianness.h>
|
||||
|
||||
struct orc_list_entry {
|
||||
struct list_head list;
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@
|
|||
#include <objtool/builtin.h>
|
||||
#include <objtool/special.h>
|
||||
#include <objtool/warn.h>
|
||||
#include <objtool/endianness.h>
|
||||
|
||||
struct special_entry {
|
||||
const char *sec;
|
||||
|
|
|
|||
Loading…
Reference in New Issue