diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-10-29 16:26:29 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-10-29 16:26:29 +0200 |
| commit | defe5ce594335cfa3f6eca9cb8ecbd65a3021af4 (patch) | |
| tree | 9179170f42e280126e9730acccbe3fc899802a9c /src | |
| parent | 713e3fa89dc4c9c371e875355824e07be89e1c65 (diff) | |
| download | box64-defe5ce594335cfa3f6eca9cb8ecbd65a3021af4.tar.gz box64-defe5ce594335cfa3f6eca9cb8ecbd65a3021af4.zip | |
Better fix for dlsym(RTLD_NEXT, ...)
Diffstat (limited to 'src')
| -rwxr-xr-x | src/librarian/librarian.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/librarian/librarian.c b/src/librarian/librarian.c index 4ee3a485..95687533 100755 --- a/src/librarian/librarian.c +++ b/src/librarian/librarian.c @@ -390,7 +390,6 @@ int GetNoSelfSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, u //search for the self, to start "next" int go = -1; int weak = 0; - const char* defver = GetDefaultVersion(my_context->globaldefver, name); for(int i=0; i<maplib->libsz && (go==-1); ++i) { if(GetElfIndex(maplib->libraries[i])!=-1 && (GetElf(maplib->libraries[i])==self)) go = i+1; @@ -409,27 +408,31 @@ int GetNoSelfSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, u // loop done, weak symbol found if(weak && *start) return 1; - #if 0 // if self defined, give it another chance with self... - defver = GetDefaultVersion(my_context->weakdefver, name); if(self) { - if(my_context->elfs[0]==self) { + if(my_context->elfs[0]!=self) { + const char* defver = GetDefaultVersion(my_context->globaldefver, name); if(GetSymbolStartEnd(GetMapSymbols(my_context->elfs[0]), name, start, end, version, vername, 1, defver)) if(*start) return 1; + defver = GetDefaultVersion(my_context->weakdefver, name); if(GetSymbolStartEnd(GetWeakSymbols(my_context->elfs[0]), name, start, end, version, vername, 1, defver)) if(*start) - return 1; + weak = 1; } - // should check weak here? for(int i=0; i<go; ++i) { if(GetElfIndex(maplib->libraries[i])==-1 || (my_context->elfs[GetElfIndex(maplib->libraries[i])]==self)) - if(GetLibWeakSymbolStartEnd(maplib->libraries[i], name, start, end, &weak, version, vername, 1)) + if(GetLibGlobalSymbolStartEnd(maplib->libraries[i], name, start, end, &weak, version, vername, 1)) if(*start) return 1; } + for(int i=0; i<go; ++i) { + if(GetElfIndex(maplib->libraries[i])==-1 || (my_context->elfs[GetElfIndex(maplib->libraries[i])]==self)) + GetLibWeakSymbolStartEnd(maplib->libraries[i], name, start, end, &weak, version, vername, 1); + } + if(weak && *start) + return 1; } - #endif // nope, not found return 0; } |