diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-10-22 20:57:31 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-10-22 20:57:31 +0200 |
| commit | 58cdb1bda2f2dd6a0bc5ea42e99b279fc687c06b (patch) | |
| tree | 099bf5dc7d814272d6842df6656c2e672d5a1143 /src/librarian/symbols.c | |
| parent | a530f565110875c431ff9600ee9da4a640599ec7 (diff) | |
| download | box64-58cdb1bda2f2dd6a0bc5ea42e99b279fc687c06b.tar.gz box64-58cdb1bda2f2dd6a0bc5ea42e99b279fc687c06b.zip | |
Refactored, again, elfloader symbol fetching (ported from box86)
Diffstat (limited to 'src/librarian/symbols.c')
| -rw-r--r-- | src/librarian/symbols.c | 68 |
1 files changed, 55 insertions, 13 deletions
diff --git a/src/librarian/symbols.c b/src/librarian/symbols.c index 8042c860..3f5bc657 100644 --- a/src/librarian/symbols.c +++ b/src/librarian/symbols.c @@ -41,7 +41,7 @@ void FreeMapSymbols(kh_mapsymbols_t** map) if(!map || !(*map)) return; versymbols_t *v; - kh_foreach_value_ref(*map, v, box_free(v->syms);); + kh_foreach_value_ref(*map, v, free(v->syms);); kh_destroy(mapsymbols, *map); *map = NULL; @@ -105,7 +105,7 @@ static versymbol_t* FindFirstVersion(versymbols_t* s) } // Match version (so ver=0:0, ver=1:-1/1/X, ver=-1:any, ver=X:1/"name") -static versymbol_t* MatchVersion(versymbols_t* s, int ver, const char* vername, int local) +static versymbol_t* MatchVersion(versymbols_t* s, int ver, const char* vername, int local, const char* defver) { if(!s || !s->sz) return NULL; @@ -120,19 +120,27 @@ static versymbol_t* MatchVersion(versymbols_t* s, int ver, const char* vername, if(local) ret = FindVersionLocal(s); if(!ret) ret = FindNoVersion(s); if(!ret) ret = FindVersionGlobal(s); - if(!ret) ret = FindFirstVersion(s); + if(!ret && defver) ret = FindVersion(s, defver); + //if(!ret) ret = FindFirstVersion(s); + return ret; + } + if(ver==-2) { + if(local) ret = FindVersionLocal(s); + if(!ret) ret = FindVersionGlobal(s); return ret; } if(ver==1) { if(local) ret = FindVersionLocal(s); if(!ret) ret = FindVersionGlobal(s); if(!ret) ret = FindNoVersion(s); - if(!ret) ret = FindFirstVersion(s); + if(!ret && defver) ret = FindVersion(s, defver); + //if(!ret) ret = FindFirstVersion(s); return ret; } ret = FindVersion(s, vername); - if(local && !ret) FindVersionLocal(s); - if(!ret) return FindVersionGlobal(s); + if(local && !ret) ret = FindVersionLocal(s); + if(!ret && defver && vername && !strcmp(defver, vername)) ret = FindVersionGlobal(s); + //if(!ret) return FindVersionGlobal(s); return ret; } @@ -152,7 +160,7 @@ void AddSymbol(kh_mapsymbols_t *mapsymbols, const char* name, uintptr_t addr, ui // add a new record if(v->sz == v->cap) { v->cap+=4; - v->syms = (versymbol_t*)box_realloc(v->syms, v->cap*sizeof(versymbol_t)); + v->syms = (versymbol_t*)realloc(v->syms, v->cap*sizeof(versymbol_t)); } int idx = v->sz++; v->syms[idx].version = ver; @@ -161,7 +169,7 @@ void AddSymbol(kh_mapsymbols_t *mapsymbols, const char* name, uintptr_t addr, ui v->syms[idx].sym.sz = sz; } -uintptr_t FindSymbol(kh_mapsymbols_t *mapsymbols, const char* name, int ver, const char* vername, int local) +uintptr_t FindSymbol(kh_mapsymbols_t *mapsymbols, const char* name, int ver, const char* vername, int local, const char* defver) { if(!mapsymbols) return 0; @@ -169,13 +177,13 @@ uintptr_t FindSymbol(kh_mapsymbols_t *mapsymbols, const char* name, int ver, con if(k==kh_end(mapsymbols)) return 0; versymbols_t * v = &kh_val(mapsymbols, k); - versymbol_t * s = MatchVersion(v, ver, vername, local); + versymbol_t * s = MatchVersion(v, ver, vername, local, defver); if(s) return s->sym.offs; return 0; } -void AddWeakSymbol(kh_mapsymbols_t *mapsymbols, const char* name, uintptr_t addr, uint32_t sz, int ver, const char* vername) +void AddUniqueSymbol(kh_mapsymbols_t *mapsymbols, const char* name, uintptr_t addr, uint32_t sz, int ver, const char* vername) { int ret; khint_t k = kh_put(mapsymbols, mapsymbols, name, &ret); @@ -189,7 +197,7 @@ void AddWeakSymbol(kh_mapsymbols_t *mapsymbols, const char* name, uintptr_t addr // add a new record if(v->sz == v->cap) { v->cap+=4; - v->syms = (versymbol_t*)box_realloc(v->syms, v->cap*sizeof(versymbol_t)); + v->syms = (versymbol_t*)realloc(v->syms, v->cap*sizeof(versymbol_t)); } int idx = v->sz++; v->syms[idx].version = ver; @@ -198,7 +206,7 @@ void AddWeakSymbol(kh_mapsymbols_t *mapsymbols, const char* name, uintptr_t addr v->syms[idx].sym.sz = sz; } -int GetSymbolStartEnd(kh_mapsymbols_t* mapsymbols, const char* name, uintptr_t* start, uintptr_t* end, int ver, const char* vername, int local) +int GetSymbolStartEnd(kh_mapsymbols_t* mapsymbols, const char* name, uintptr_t* start, uintptr_t* end, int ver, const char* vername, int local, const char* defver) { if(!mapsymbols) return 0; @@ -206,7 +214,7 @@ int GetSymbolStartEnd(kh_mapsymbols_t* mapsymbols, const char* name, uintptr_t* if(k==kh_end(mapsymbols)) return 0; versymbols_t * v = &kh_val(mapsymbols, k); - versymbol_t* s = MatchVersion(v, ver, vername, local); + versymbol_t* s = MatchVersion(v, ver, vername, local, defver); if(s) { *start = s->sym.offs; *end = *start + s->sym.sz; @@ -231,3 +239,37 @@ const char* GetSymbolName(kh_mapsymbols_t* mapsymbols, void* p, uintptr_t* start ); return NULL; } + + +KHASH_MAP_IMPL_STR(defaultversion, const char*) +kh_defaultversion_t* NewDefaultVersion() +{ + kh_defaultversion_t* ret = kh_init(defaultversion); + return ret; +} + +void FreeDefaultVersion(kh_defaultversion_t** def) +{ + if(!def || !*def) + return; + const char* v; + kh_foreach_value(*def, v, free((char*)v);); + + kh_destroy(defaultversion, *def); + *def = NULL; +} + +void AddDefaultVersion(kh_defaultversion_t* def, const char* symname, const char* vername) +{ + int ret; + khint_t k = kh_put(defaultversion, def, symname, &ret); + if(!ret) return; // already set! + kh_value(def, k) = strdup(vername); +} +const char* GetDefaultVersion(kh_defaultversion_t* def, const char* symname) +{ + khint_t k = kh_get(defaultversion, def, symname); + if(k==kh_end(def)) + return NULL; + return kh_value(def, k); +} |