Collect dynamic symbols from patch

This commit is contained in:
2025-04-21 23:55:14 +03:00
parent 26752683a1
commit 57b47cec64
9 changed files with 269 additions and 52 deletions

View File

@@ -1,20 +1,52 @@
#ifndef SYMBOLS_H_
#define SYMBOLS_H_
#include "memory.h"
#include "array/array.h"
#include "array/sc_array.h"
#include "types.h"
#include <link.h>
#include <stddef.h>
#include <stdint.h>
typedef enum {
HI_SYMBOL_BIND_LOCAL,
HI_SYMBOL_BIND_GLOBAL,
HI_SYMBOL_BIND_WEAK,
} HiSymbolBind;
typedef struct {
struct sc_array_str names;
struct sc_array_ptr addresses;
} SymbolInfos;
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;
sc_array_def(SymbolInfos, syms);
typedef struct HiSymbol {
const char *name;
HiSymbolBind binding;
HiSymbolType type;
void *address;
} HiSymbol;
sc_array_def(HiSymbol, sym);
typedef struct sc_array_sym HiSymbols;
void hi_free_symbol_info(SymbolInfos *);
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);
}
HiSymbolBind symbol_bind_from_efi(u32 efi_bind);
HiSymbolType symbol_type_from_efi(u32 efi_type);
#endif // SYMBOLS_H_