43 lines
1.4 KiB
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;
|
|
}
|