diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-07-09 12:38:48 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-07-09 12:38:48 +0200 |
| commit | dabbca767f9de4fc4cf68252037de3061592eae2 (patch) | |
| tree | bfc1dadad814a82a155c0c374097177b94154beb /src/librarian | |
| parent | ca9bc1361943575724eb5152798aa208ed5eed6c (diff) | |
| download | box64-dabbca767f9de4fc4cf68252037de3061592eae2.tar.gz box64-dabbca767f9de4fc4cf68252037de3061592eae2.zip | |
[ELFLOADER] Added a check if lib version is compatible with what the elf loading it wants (helps Linux games on Steam)
Diffstat (limited to 'src/librarian')
| -rwxr-xr-x | src/librarian/librarian.c | 16 | ||||
| -rwxr-xr-x | src/librarian/library.c | 24 |
2 files changed, 24 insertions, 16 deletions
diff --git a/src/librarian/librarian.c b/src/librarian/librarian.c index d9f20a9a..8ed3fe8b 100755 --- a/src/librarian/librarian.c +++ b/src/librarian/librarian.c @@ -177,7 +177,7 @@ int isLibLocal(library_t* lib) return libraryInMapLib(my_context->local_maplib, lib); } -int AddNeededLib_add(lib_t* maplib, int local, needed_libs_t* needed, int n, box64context_t* box64, x64emu_t* emu) +static int AddNeededLib_add(lib_t* maplib, int local, needed_libs_t* needed, int n, elfheader_t* verneeded, box64context_t* box64, x64emu_t* emu) { const char* path = needed->names[n]; printf_log(LOG_DEBUG, "Trying to add \"%s\" to maplib%s\n", path, local?" (local)":""); @@ -213,7 +213,7 @@ int AddNeededLib_add(lib_t* maplib, int local, needed_libs_t* needed, int n, box return 0; } // load a new one - needed->libs[n] = lib = NewLibrary(path, box64); + needed->libs[n] = lib = NewLibrary(path, box64, verneeded); if(!lib) { printf_log(LOG_DEBUG, "Faillure to create lib => fail\n"); return 1; //Error @@ -257,7 +257,7 @@ int AddNeededLib_add(lib_t* maplib, int local, needed_libs_t* needed, int n, box return 0; } -int AddNeededLib_init(lib_t* maplib, int local, int bindnow, library_t* lib, box64context_t* box64, x64emu_t* emu) +int AddNeededLib_init(lib_t* maplib, int local, int bindnow, library_t* lib, elfheader_t* verneeded, box64context_t* box64, x64emu_t* emu) { if(!lib) // no lib, error is already detected, no need to return a new one return 0; @@ -283,7 +283,7 @@ int AddNeededLib_init(lib_t* maplib, int local, int bindnow, library_t* lib, box tmp.size = tmp.cap = 1; tmp.names = names; tmp.libs = libs; - AddNeededLib(maplib, 0, 0, &tmp, box64, emu); + AddNeededLib(maplib, 0, 0, &tmp, verneeded, box64, emu); } if(!strcmp(GetNameLib(lib), "libmss.so.6")) { char* names[] = {"libSDL-1.2.so.0", "libdl.so.2"}; // TODO: they will never be uninit... @@ -292,7 +292,7 @@ int AddNeededLib_init(lib_t* maplib, int local, int bindnow, library_t* lib, box tmp.size = tmp.cap = 2; tmp.names = names; tmp.libs = libs; - AddNeededLib(maplib, 0, 0, &tmp, box64, emu); + AddNeededLib(maplib, 0, 0, &tmp, verneeded, box64, emu); } // finalize the lib @@ -318,7 +318,7 @@ void AddNeededLib_remove(lib_t* maplib, int local, library_t** lib, box64context } EXPORTDYN -int AddNeededLib(lib_t* maplib, int local, int bindnow, needed_libs_t* needed, box64context_t* box64, x64emu_t* emu) +int AddNeededLib(lib_t* maplib, int local, int bindnow, needed_libs_t* needed, elfheader_t* verneeded, box64context_t* box64, x64emu_t* emu) { if(!needed) // no needed libs, no problems return 0; @@ -326,7 +326,7 @@ int AddNeededLib(lib_t* maplib, int local, int bindnow, needed_libs_t* needed, b int ret = 0; // Add libs and symbol for(int i=0; i<needed->size; ++i) { - if(AddNeededLib_add(maplib, local, needed, i, box64, emu)) { + if(AddNeededLib_add(maplib, local, needed, i, verneeded, box64, emu)) { printf_log(strchr(needed->names[i],'/')?LOG_DEBUG:LOG_INFO, "Error loading needed lib %s\n", needed->names[i]); ret = 1; } @@ -337,7 +337,7 @@ int AddNeededLib(lib_t* maplib, int local, int bindnow, needed_libs_t* needed, b } // add dependant libs and init them for (int i=0; i<needed->size; ++i) - if(AddNeededLib_init(maplib, local, bindnow, needed->libs[i], box64, emu)) { + if(AddNeededLib_init(maplib, local, bindnow, needed->libs[i], verneeded, box64, emu)) { printf_log(LOG_INFO, "Error initializing needed lib %s\n", needed->names[i]); if(!allow_missing_libs) ret = 1; } diff --git a/src/librarian/library.c b/src/librarian/library.c index 9b2bb997..b3bec1b4 100755 --- a/src/librarian/library.c +++ b/src/librarian/library.c @@ -217,7 +217,7 @@ static void initWrappedLib(library_t *lib, box64context_t* context) { lib->type = LIB_WRAPPED; lib->w.refcnt = 1; // Call librarian to load all dependant elf - if(AddNeededLib(context->maplib, 0, 0, lib->w.needed, context, thread_get_emu())) { + if(AddNeededLib(context->maplib, 0, 0, lib->w.needed, NULL, context, thread_get_emu())) { printf_log(LOG_NONE, "Error: loading a needed libs in elf %s\n", lib->name); return; } @@ -240,7 +240,7 @@ static void initWrappedLib(library_t *lib, box64context_t* context) { } } -static int loadEmulatedLib(const char* libname, library_t *lib, box64context_t* context) +static int loadEmulatedLib(const char* libname, library_t *lib, box64context_t* context, elfheader_t* verneeded) { if(FileExist(libname, IS_FILE)) { @@ -255,28 +255,36 @@ static int loadEmulatedLib(const char* libname, library_t *lib, box64context_t* fclose(f); return 0; } - int mainelf = AddElfHeader(context, elf_header); if(CalcLoadAddr(elf_header)) { printf_log(LOG_NONE, "Error: reading elf header of %s\n", libname); + FreeElfHeader(&elf_header); fclose(f); return 0; } // allocate memory if(AllocElfMemory(context, elf_header, 0)) { printf_log(LOG_NONE, "Error: allocating memory for elf %s\n", libname); + FreeElfHeader(&elf_header); fclose(f); return 0; } // Load elf into memory if(LoadElfMemory(f, context, elf_header)) { printf_log(LOG_NONE, "Error: loading in memory elf %s\n", libname); + FreeElfHeader(&elf_header); fclose(f); return 0; } // can close the file now fclose(f); + if(verneeded && !isElfHasNeededVer(elf_header, lib->name, verneeded)) { + // incompatible, discard and continue the search + FreeElfHeader(&elf_header); + return 0; + } + int mainelf = AddElfHeader(context, elf_header); ElfAttachLib(elf_header, lib); lib->type = LIB_EMULATED; @@ -316,13 +324,13 @@ static int loadEmulatedLib(const char* libname, library_t *lib, box64context_t* return 0; } -static void initEmulatedLib(const char* path, library_t *lib, box64context_t* context) +static void initEmulatedLib(const char* path, library_t *lib, box64context_t* context, elfheader_t* verneeded) { char libname[MAX_PATH]; strcpy(libname, path); int found = FileIsX64ELF(libname); if(found) - if(loadEmulatedLib(libname, lib, context)) + if(loadEmulatedLib(libname, lib, context, verneeded)) return; if(!strchr(path, '/')) for(int i=0; i<context->box64_ld_lib.size; ++i) @@ -330,7 +338,7 @@ static void initEmulatedLib(const char* path, library_t *lib, box64context_t* co strcpy(libname, context->box64_ld_lib.paths[i]); strcat(libname, path); if(FileIsX64ELF(libname)) - if(loadEmulatedLib(libname, lib, context)) + if(loadEmulatedLib(libname, lib, context, verneeded)) return; } } @@ -353,7 +361,7 @@ static int isEssentialLib(const char* name) { return 0; } -library_t *NewLibrary(const char* path, box64context_t* context) +library_t *NewLibrary(const char* path, box64context_t* context, elfheader_t* verneeded) { printf_log(LOG_DEBUG, "Trying to load \"%s\"\n", path); library_t *lib = (library_t*)box_calloc(1, sizeof(library_t)); @@ -399,7 +407,7 @@ library_t *NewLibrary(const char* path, box64context_t* context) initWrappedLib(lib, context); // then look for a native one if(lib->type==LIB_UNNKNOW) - initEmulatedLib(path, lib, context); + initEmulatedLib(path, lib, context, verneeded); // still not loaded but notwrapped indicated: use wrapped... if(lib->type==LIB_UNNKNOW && notwrapped && !precise) initWrappedLib(lib, context); |