| #ifndef COMMON_H |
| #define COMMON_H |
| |
| #include <libelf.h> |
| #include <elf.h> |
| |
| #define unlikely(expr) __builtin_expect (expr, 0) |
| #define likely(expr) __builtin_expect (expr, 1) |
| |
| #define MIN(a,b) ((a)<(b)?(a):(b)) /* no side effects in arguments allowed! */ |
| |
| typedef int (*section_match_fn_t)(Elf *, Elf_Scn *, void *); |
| void map_over_sections(Elf *, section_match_fn_t, void *); |
| |
| typedef int (*segment_match_fn_t)(Elf *, Elf32_Phdr *, void *); |
| void map_over_segments(Elf *, segment_match_fn_t, void *); |
| |
| typedef struct { |
| Elf_Scn *sect; |
| Elf32_Shdr *hdr; |
| Elf_Data *data; |
| size_t index; |
| } section_info_t; |
| |
| static inline void get_section_info(Elf_Scn *sect, section_info_t *info) |
| { |
| info->sect = sect; |
| info->data = elf_getdata(sect, 0); |
| info->hdr = elf32_getshdr(sect); |
| info->index = elf_ndxscn(sect); |
| } |
| |
| static inline int is_host_little(void) |
| { |
| short val = 0x10; |
| return ((char *)&val)[0] != 0; |
| } |
| |
| static inline long switch_endianness(long val) |
| { |
| long newval; |
| ((char *)&newval)[3] = ((char *)&val)[0]; |
| ((char *)&newval)[2] = ((char *)&val)[1]; |
| ((char *)&newval)[1] = ((char *)&val)[2]; |
| ((char *)&newval)[0] = ((char *)&val)[3]; |
| return newval; |
| } |
| |
| #endif/*COMMON_H*/ |