58 lines
1.3 KiB
C
58 lines
1.3 KiB
C
#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_
|