/*
* common.h - Common internal operations performed by the module subsystem
*
* Created on: Aug 11, 2008
* Author: Stefan Bucur <stefanb@zytor.com>
*/
#ifndef COMMON_H_
#define COMMON_H_
#include <stdio.h>
#include <sys/module.h>
#include <linux/list.h>
#include "elfutils.h"
// Performs an operation and jumps to a given label if an error occurs
#define CHECKED(res, expr, error) \
do { \
(res) = (expr); \
if ((res) < 0) \
goto error; \
} while (0)
#define MIN(x,y) (((x) < (y)) ? (x) : (y))
#define MAX(x,y) (((x) > (y)) ? (x) : (y))
static inline Elf_Sym *symbol_get_entry(struct elf_module *module, int entry)
{
char *sym_table = (char *)module->sym_table;
int index = entry * module->syment_size;
return (Elf_Sym *)(sym_table + index);
}
//#define ELF_DEBUG
#ifdef ELF_DEBUG
#define DBG_PRINT(fmt, args...) fprintf(stderr, "[ELF] " fmt, ##args)
#else
#define DBG_PRINT(fmt, args...) // Expand to nothing
#endif
// User-space debugging routines
#ifdef ELF_DEBUG
extern void print_elf_ehdr(Elf_Ehdr *ehdr);
extern void print_elf_symbols(struct elf_module *module);
#endif //ELF_DEBUG
/*
* Image files manipulation routines
*/
extern int image_load(struct elf_module *module);
extern int image_unload(struct elf_module *module);
extern int image_read(void *buff, size_t size, struct elf_module *module);
extern int image_skip(size_t size, struct elf_module *module);
extern int image_seek(Elf_Off offset, struct elf_module *module);
extern struct module_dep *module_dep_alloc(struct elf_module *module);
extern int check_header_common(Elf_Ehdr *elf_hdr);
extern int enforce_dependency(struct elf_module *req, struct elf_module *dep);
extern int clear_dependency(struct elf_module *req, struct elf_module *dep);
extern int check_symbols(struct elf_module *module);
#endif /* COMMON_H_ */