diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-02-15 18:11:57 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-02-15 18:11:57 +0100 |
| commit | c5a6875de940f296932154be434d2864e0652da8 (patch) | |
| tree | 278a857811a6bf1d82c945ec647f6846f4a8e029 /src/include | |
| parent | 549e042e678e0909c1a79325fb406fb0081ccac7 (diff) | |
| download | box64-c5a6875de940f296932154be434d2864e0652da8.tar.gz box64-c5a6875de940f296932154be434d2864e0652da8.zip | |
[ELFLOADER] Huge refactor of elfloader and symbol resolution. Some more cleaning need to be done, but that's a first step (should help #422, #360, #1046 and probably others)
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/box64context.h | 1 | ||||
| -rw-r--r-- | src/include/elfloader.h | 14 | ||||
| -rw-r--r-- | src/include/librarian.h | 22 | ||||
| -rw-r--r-- | src/include/library.h | 6 | ||||
| -rw-r--r-- | src/include/symbols.h | 18 | ||||
| -rw-r--r-- | src/include/wrappedlibs.h | 2 |
6 files changed, 28 insertions, 35 deletions
diff --git a/src/include/box64context.h b/src/include/box64context.h index da09bc49..efe84223 100644 --- a/src/include/box64context.h +++ b/src/include/box64context.h @@ -121,6 +121,7 @@ typedef struct box64context_s { lib_t *local_maplib; // libs and symbols openned has local (only collection of libs, no symbols) dic_t *versym; // dictionnary of versioned symbols kh_mapsymbols_t *globdata; // GLOBAL_DAT relocation for COPY mapping in main elf + kh_mapsymbols_t *uniques; // symbols with STB_GNU_UNIQUE bindings kh_threadstack_t *stacksizes; // stack sizes attributes for thread (temporary) bridge_t *system; // other bridges diff --git a/src/include/elfloader.h b/src/include/elfloader.h index 80289c5c..ea0928b1 100644 --- a/src/include/elfloader.h +++ b/src/include/elfloader.h @@ -26,12 +26,13 @@ int CalcLoadAddr(elfheader_t* head); int AllocLoadElfMemory(box64context_t* context, elfheader_t* head, int mainbin); void FreeElfMemory(elfheader_t* head); int isElfHasNeededVer(elfheader_t* head, const char* libname, elfheader_t* verneeded); +void GrabX64CopyMainElfReloc(elfheader_t* head); int RelocateElf(lib_t *maplib, lib_t* local_maplib, int bindnow, int deepbind, elfheader_t* head); int RelocateElfPlt(lib_t *maplib, lib_t* local_maplib, int bindnow, int deepbind, elfheader_t* head); void CalcStack(elfheader_t* h, uint64_t* stacksz, size_t* stackalign); uintptr_t GetEntryPoint(lib_t* maplib, elfheader_t* h); uintptr_t GetLastByte(elfheader_t* h); -void AddSymbols(lib_t *maplib, kh_mapsymbols_t* mapsymbols, kh_mapsymbols_t* weaksymbols, kh_mapsymbols_t* localsymbols, elfheader_t* h); +void AddSymbols(lib_t *maplib, elfheader_t* h); int LoadNeededLibs(elfheader_t* h, lib_t *maplib, int local, int bindnow, int deepbind, box64context_t *box64, x64emu_t* emu); uintptr_t GetElfInit(elfheader_t* h); uintptr_t GetElfFini(elfheader_t* h); @@ -62,17 +63,16 @@ int ElfCheckIfUseTCMallocMinimal(elfheader_t* h); // return 1 if tcmalloc is u const char* GetSymbolVersion(elfheader_t* h, int version); const char* GetParentSymbolVersion(elfheader_t* h, int index); const char* VersionedName(const char* name, int ver, const char* vername); -int SameVersionedSymbol(const char* name1, int ver1, const char* vername1, const char* name2, int ver2, const char* vername2); +int SameVersionedSymbol(const char* name1, int ver1, const char* vername1, int veropt1, const char* name2, int ver2, const char* vername2, int veropt2); int GetVersionIndice(elfheader_t* h, const char* vername); int GetNeededVersionCnt(elfheader_t* h, const char* libname); const char* GetNeededVersionString(elfheader_t* h, const char* libname, int idx); int GetNeededVersionForLib(elfheader_t* h, const char* libname, const char* ver); -kh_mapsymbols_t* GetMapSymbols(elfheader_t* h); -kh_mapsymbols_t* GetWeakSymbols(elfheader_t* h); -kh_mapsymbols_t* GetLocalSymbols(elfheader_t* h); -kh_defaultversion_t* GetGlobalDefaultVersion(elfheader_t* h); -kh_defaultversion_t* GetWeakDefaultVersion(elfheader_t* h); +void* ElfGetLocalSymbolStartEnd(elfheader_t* head, uintptr_t *offs, uintptr_t *sz, const char* symname, int* ver, const char** vername, int local, int* veropt); +void* ElfGetGlobalSymbolStartEnd(elfheader_t* head, uintptr_t *offs, uintptr_t *sz, const char* symname, int* ver, const char** vername, int local, int* veropt); +void* ElfGetWeakSymbolStartEnd(elfheader_t* head, uintptr_t *offs, uintptr_t *sz, const char* symname, int* ver, const char** vername, int local, int* veropt); +int ElfGetSymTabStartEnd(elfheader_t* head, uintptr_t *offs, uintptr_t *end, const char* symname); void* GetNativeSymbolUnversioned(void* lib, const char* name); diff --git a/src/include/librarian.h b/src/include/librarian.h index 2864f246..74a94373 100644 --- a/src/include/librarian.h +++ b/src/include/librarian.h @@ -12,9 +12,10 @@ typedef struct x64emu_s x64emu_t; typedef struct elfheader_s elfheader_t; typedef struct needed_libs_s needed_libs_t; typedef struct kh_mapoffsets_s kh_mapoffsets_t; +typedef enum symbol_type_s symbol_type_t; typedef char* cstr_t; -lib_t *NewLibrarian(box64context_t* context, int ownlibs); +lib_t *NewLibrarian(box64context_t* context); void FreeLibrarian(lib_t **maplib, x64emu_t* emu); dlprivate_t *NewDLPrivate(void); void FreeDLPrivate(dlprivate_t **lib); @@ -27,20 +28,19 @@ library_t* GetLibMapLib(lib_t* maplib, const char* name); library_t* GetLibInternal(const char* name); void promoteLocalLibGlobal(library_t* lib); int isLibLocal(library_t* lib); -uintptr_t FindGlobalSymbol(lib_t *maplib, const char* name, int version, const char* vername); -int GetNoSelfSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t* self, size_t size, int version, const char* vername, const char* globdefver, const char* weakdefver); -int GetGlobalSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t *self, int version, const char* vername, const char* globdefver, const char* weakdefver); -int GetGlobalWeakSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t *self, int version, const char* vername, const char* globdefver, const char* weakdefver); -int GetGlobalNoWeakSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, int version, const char* vername, const char* defver); -int GetLocalSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t *self, int version, const char* vername, const char* globdefver, const char* weakdefver); -elfheader_t* GetGlobalSymbolElf(lib_t *maplib, const char* name, int version, const char* vername); -int IsGlobalNoWeakSymbolInNative(lib_t *maplib, const char* name, int version, const char* vername, const char* defver); +uintptr_t FindGlobalSymbol(lib_t *maplib, const char* name, int version, const char* vername, int veropt); +int GetNoSelfSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t* self, size_t size, int version, const char* vername, int veropt, void** elfsym); +int GetGlobalSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t* self, int version, const char* vername, int veropt, void** elfsym); +int GetGlobalWeakSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t *self, int version, const char* vername, int veropt, void** elfsym); +int GetGlobalNoWeakSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, int version, const char* vername, int veropt, void** elfsym); +int GetLocalSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t *self, int version, const char* vername, int veropt, void** elfsym); +elfheader_t* GetGlobalSymbolElf(lib_t *maplib, const char* name, int version, const char* vername, int veropt); +int IsGlobalNoWeakSymbolInNative(lib_t *maplib, const char* name, int version, const char* vername, int veropt); +int GetSymTabStartEnd(lib_t* maplib, const char* name, uintptr_t* start, uintptr_t* end); void MapLibRemoveLib(lib_t* maplib, library_t* lib); void MapLibPrependLib(lib_t* maplib, library_t* lib, library_t* ref); -const char* GetMaplibDefaultVersion(lib_t *maplib, lib_t *local_maplib, int isweak, int deepbind, const char* symname); - const char* FindSymbolName(lib_t *maplib, void* p, void** start, uint64_t* sz, const char** libname, void** base, library_t** lib); void AddOffsetSymbol(lib_t *maplib, void* offs, const char* name); diff --git a/src/include/library.h b/src/include/library.h index 4cc1012f..4e7ba0d1 100644 --- a/src/include/library.h +++ b/src/include/library.h @@ -21,9 +21,9 @@ int FinalizeLibrary(library_t* lib, lib_t* local_maplib, int bindnow, int deepbi char* GetNameLib(library_t *lib); int IsSameLib(library_t* lib, const char* path); // check if lib is same (path -> name) -int GetLibGlobalSymbolStartEnd(library_t* lib, const char* name, uintptr_t* start, uintptr_t* end, size_t size, int* weak, int version, const char* vername, int local, const char* defver); -int GetLibWeakSymbolStartEnd(library_t* lib, const char* name, uintptr_t* start, uintptr_t* end, size_t size, int* weak, int version, const char* vername, int local, const char* defver); -int GetLibLocalSymbolStartEnd(library_t* lib, const char* name, uintptr_t* start, uintptr_t* end, size_t size, int* weak, int version, const char* vername, int local, const char* defver); +int GetLibGlobalSymbolStartEnd(library_t* lib, const char* name, uintptr_t* start, uintptr_t* end, size_t size, int* weak, int* version, const char** vername, int local, int* veropt, void** elfsym); +int GetLibWeakSymbolStartEnd(library_t* lib, const char* name, uintptr_t* start, uintptr_t* end, size_t size, int* weak, int* version, const char** vername, int local, int* veropt, void** elfsym); +int GetLibLocalSymbolStartEnd(library_t* lib, const char* name, uintptr_t* start, uintptr_t* end, size_t size, int* weak, int* version, const char** vername, int local, int* veropt, void** elfsym); char** GetNeededLibsNames(library_t* lib); int GetNeededLibsN(library_t* lib); library_t* GetNeededLib(library_t* lib, int idx); diff --git a/src/include/symbols.h b/src/include/symbols.h index 32e54b20..367c274b 100644 --- a/src/include/symbols.h +++ b/src/include/symbols.h @@ -13,22 +13,14 @@ kh_mapsymbols_t* NewMapSymbols(void); void FreeMapSymbols(kh_mapsymbols_t** map); // replace if already there -void AddSymbol(kh_mapsymbols_t *mapsymbols, const char* name, uintptr_t addr, uint32_t sz, int ver, const char* vername); -uintptr_t FindSymbol(kh_mapsymbols_t *mapsymbols, const char* name, int ver, const char* vername, int local, const char* defver); +void AddSymbol(kh_mapsymbols_t *mapsymbols, const char* name, uintptr_t addr, uint32_t sz, int ver, const char* vername, int veropt); +uintptr_t FindSymbol(kh_mapsymbols_t *mapsymbols, const char* name, int ver, const char* vername, int local, int veropt); // Update addr and sz of existing symbols void ForceUpdateSymbol(kh_mapsymbols_t *mapsymbols, const char* name, uintptr_t addr, uint32_t sz); // don't add if already there -void AddUniqueSymbol(kh_mapsymbols_t *mapsymbols, const char* name, uintptr_t addr, uint32_t sz, int ver, const char* vername); -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); -int GetSizedSymbolStartEnd(kh_mapsymbols_t* mapsymbols, const char* name, uintptr_t* start, uintptr_t* end, size_t size, int ver, const char* vername, int local, const char* defver); +void AddUniqueSymbol(kh_mapsymbols_t *mapsymbols, const char* name, uintptr_t addr, uint32_t sz, int ver, const char* vername, int veropt); +int GetSymbolStartEnd(kh_mapsymbols_t* mapsymbols, const char* name, uintptr_t* start, uintptr_t* end, int ver, const char* vername, int local, int veropt); +int GetSizedSymbolStartEnd(kh_mapsymbols_t* mapsymbols, const char* name, uintptr_t* start, uintptr_t* end, size_t size, int ver, const char* vername, int local, int veropt); const char* GetSymbolName(kh_mapsymbols_t* mapsymbols, void* p, uintptr_t* offs, uint32_t* sz, const char** vername); -// default version handling -KHASH_MAP_DECLARE_STR(defaultversion, const char*) -kh_defaultversion_t* NewDefaultVersion(void); -void FreeDefaultVersion(kh_defaultversion_t** def); - -void AddDefaultVersion(kh_defaultversion_t* def, const char* symname, const char* vername); -const char* GetDefaultVersion(kh_defaultversion_t* def, const char* symname); - #endif //__SYMBOLS_PRIVATE_H_ \ No newline at end of file diff --git a/src/include/wrappedlibs.h b/src/include/wrappedlibs.h index afe997cb..9379a905 100644 --- a/src/include/wrappedlibs.h +++ b/src/include/wrappedlibs.h @@ -7,7 +7,7 @@ typedef struct box64context_s box64context_t; typedef int (*wrappedlib_init_t)(library_t * lib, box64context_t* box64); // 0 = success typedef void (*wrappedlib_fini_t)(library_t * lib); -typedef int (*wrappedlib_get_t)(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, size_t size, int* weak, int version, const char* vername, int local, const char* defver); +typedef int (*wrappedlib_get_t)(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, size_t size, int* weak, int* version, const char** vername, int local, int* veropt, void** elfsym); void setNeededLibs(library_t* lib, int n, ...); #define SETALT0(v) #v |