diff options
| author | ptitSeb <seebastien.chev@gmail.com> | 2023-08-19 16:35:57 +0200 |
|---|---|---|
| committer | ptitSeb <seebastien.chev@gmail.com> | 2023-08-19 16:35:57 +0200 |
| commit | 9e7225be3698bbb970ef0674ebb282dada8fec45 (patch) | |
| tree | 42674381cd2d6a0501eef54daa96f3d60b4412fb /src/elfs | |
| parent | 154acbef72706a72787f56083bae72689808c3b1 (diff) | |
| download | box64-9e7225be3698bbb970ef0674ebb282dada8fec45.tar.gz box64-9e7225be3698bbb970ef0674ebb282dada8fec45.zip | |
[ELFLOADER] Adjusted fetching of symbol (help Steam Unity3d linux games, like Canabalt)
Diffstat (limited to 'src/elfs')
| -rw-r--r-- | src/elfs/elfloader.c | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index 265a6241..6a516601 100644 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -490,11 +490,20 @@ int RelocateElfREL(lib_t *maplib, lib_t *local_maplib, int bindnow, elfheader_t* end = offs + sym->st_size; }*/ // so weak symbol are the one left - if(!offs && !end) { - if(!offs && !end && local_maplib) - GetGlobalSymbolStartEnd(local_maplib, symname, &offs, &end, head, version, vername, globdefver, weakdefver); - if(!offs && !end && local_maplib) - GetGlobalSymbolStartEnd(maplib, symname, &offs, &end, head, version, vername, globdefver, weakdefver); + if(bind==STB_WEAK) { + if(!offs && !end) { + if(!offs && !end && local_maplib) + GetGlobalWeakSymbolStartEnd(local_maplib, symname, &offs, &end, head, version, vername, globdefver, weakdefver); + if(!offs && !end && local_maplib) + GetGlobalWeakSymbolStartEnd(maplib, symname, &offs, &end, head, version, vername, globdefver, weakdefver); + } + } else { + if(!offs && !end) { + if(!offs && !end && local_maplib) + GetGlobalSymbolStartEnd(local_maplib, symname, &offs, &end, head, version, vername, globdefver, weakdefver); + if(!offs && !end && local_maplib) + GetGlobalSymbolStartEnd(maplib, symname, &offs, &end, head, version, vername, globdefver, weakdefver); + } } } uintptr_t globoffs, globend; @@ -692,13 +701,24 @@ int RelocateElfRELA(lib_t *maplib, lib_t *local_maplib, int bindnow, elfheader_t end = offs + sym->st_size; }*/ // so weak symbol are the one left - if(old_version==version && old_bind==bind && old_symname==symname) { - offs = old_offs; - end = old_end; + if(bind==STB_WEAK) { + if(old_version==version && old_bind==bind && old_symname==symname) { + offs = old_offs; + end = old_end; + } else { + GetGlobalWeakSymbolStartEnd(maplib, symname, &offs, &end, head, version, vername, globdefver, weakdefver); + if(!offs && !end && local_maplib) + GetGlobalWeakSymbolStartEnd(local_maplib, symname, &offs, &end, head, version, vername, globdefver, weakdefver); + } } else { - GetGlobalSymbolStartEnd(maplib, symname, &offs, &end, head, version, vername, globdefver, weakdefver); - if(!offs && !end && local_maplib) - GetGlobalSymbolStartEnd(local_maplib, symname, &offs, &end, head, version, vername, globdefver, weakdefver); + if(old_version==version && old_bind==bind && old_symname==symname) { + offs = old_offs; + end = old_end; + } else { + GetGlobalSymbolStartEnd(maplib, symname, &offs, &end, head, version, vername, globdefver, weakdefver); + if(!offs && !end && local_maplib) + GetGlobalSymbolStartEnd(local_maplib, symname, &offs, &end, head, version, vername, globdefver, weakdefver); + } } } old_bind = bind; |