#ifndef SYMBOLS_H_ #define SYMBOLS_H_ #include "array/array.h" #include "array/sc_array.h" #include "types.h" typedef enum { HI_SYMBOL_BIND_LOCAL, HI_SYMBOL_BIND_GLOBAL, HI_SYMBOL_BIND_WEAK, } HiSymbolBind; typedef enum { HI_SYMBOL_TYPE_NOTYPE, HI_SYMBOL_TYPE_OBJECT, HI_SYMBOL_TYPE_FUNC, HI_SYMBOL_TYPE_SECTION, HI_SYMBOL_TYPE_FILE, HI_SYMBOL_TYPE_COMMON, HI_SYMBOL_TYPE_TLS, } HiSymbolType; typedef struct HiSymbol { const char *name; HiSymbolBind binding; HiSymbolType type; size_t size; void *address; void **got_entry; void *orig_address; } HiSymbol; sc_array_def(HiSymbol, sym); typedef struct sc_array_sym HiSymbols; static inline void symbol_free(HiSymbol *symbol) { free((char *)symbol->name); } static inline void symbol_init_symbols(HiSymbols *symbols) { sc_array_init(symbols); } static inline void symbol_clear_symbols(HiSymbols *symbols) { for (size_t i = 0; i < sc_array_size(symbols); ++i) { symbol_free(&sc_array_at(symbols, i)); } sc_array_clear(symbols); } static inline void symbol_term_symbols(HiSymbols *symbols) { symbol_clear_symbols(symbols); sc_array_term(symbols); } HiSymbol *symbol_find(HiSymbols *symbols, HiSymbol *symbol); HiSymbolBind symbol_bind_from_efibind(u32 efi_bind); HiSymbolType symbol_type_from_efitype(u32 efi_type); #endif // SYMBOLS_H_