Files
hiload/src/symbols.c

43 lines
1.4 KiB
C

#include "symbols.h"
#include "array/sc_array.h"
#include <elf.h>
#include <string.h>
HiSymbol *symbol_find(HiSymbols *symbols, HiSymbol *symbol) {
size_t namelen = strlen(symbol->name);
for (size_t i=0; i < sc_array_size(symbols); ++i) {
HiSymbol *s = &sc_array_at(symbols, i);
if (strcmp(s->name, symbol->name) == 0) {
return s;
}
}
return NULL;
}
HiSymbolBind symbol_bind_from_efi(u32 efi_bind) {
// clang-format off
switch (efi_bind) {
case STB_LOCAL: return HI_SYMBOL_BIND_LOCAL;
case STB_GLOBAL: return HI_SYMBOL_BIND_GLOBAL;
case STB_WEAK: return HI_SYMBOL_BIND_WEAK;
}
// clang-format on
return ~0u;
}
HiSymbolType symbol_type_from_efi(u32 efi_type) {
// clang-format off
switch (efi_type) {
case STT_NOTYPE: return HI_SYMBOL_TYPE_NOTYPE; /* Symbol type is unspecified */
case STT_OBJECT: return HI_SYMBOL_TYPE_OBJECT; /* Symbol is a data object */
case STT_FUNC: return HI_SYMBOL_TYPE_FUNC; /* Symbol is a code object */
case STT_SECTION: return HI_SYMBOL_TYPE_SECTION; /* Symbol associated with a section */
case STT_FILE: return HI_SYMBOL_TYPE_FILE; /* Symbol's name is file name */
case STT_COMMON: return HI_SYMBOL_TYPE_COMMON; /* Symbol is a common data object */
case STT_TLS: return HI_SYMBOL_TYPE_TLS; /* Symbol is thread-local data object*/
}
// clang-format on
return ~0u;
}