diff options
Diffstat (limited to 'src/include')
| -rwxr-xr-x | src/include/box64context.h | 2 | ||||
| -rwxr-xr-x | src/include/dictionnary.h | 13 | ||||
| -rwxr-xr-x | src/include/elfload_dump.h | 2 | ||||
| -rwxr-xr-x | src/include/elfloader.h | 5 | ||||
| -rwxr-xr-x | src/include/librarian.h | 26 | ||||
| -rwxr-xr-x | src/include/library.h | 7 | ||||
| -rw-r--r-- | src/include/symbols.h | 24 | ||||
| -rwxr-xr-x | src/include/wrappedlibs.h | 2 |
8 files changed, 60 insertions, 21 deletions
diff --git a/src/include/box64context.h b/src/include/box64context.h index d5e8b82d..a83d79ec 100755 --- a/src/include/box64context.h +++ b/src/include/box64context.h @@ -3,6 +3,7 @@ #include <stdint.h> #include <pthread.h> #include "pathcoll.h" +#include "dictionnary.h" typedef struct elfheader_s elfheader_t; typedef struct cleanup_s cleanup_t; @@ -97,6 +98,7 @@ typedef struct box64context_s { lib_t *maplib; // lib and symbols handling lib_t *local_maplib; // libs and symbols openned has local (only collection of libs, no symbols) + dic_t *versym; // dictionnary of versionned symbols kh_threadstack_t *stacksizes; // stack sizes attributes for thread (temporary) bridge_t *system; // other bridges diff --git a/src/include/dictionnary.h b/src/include/dictionnary.h new file mode 100755 index 00000000..e2ec1466 --- /dev/null +++ b/src/include/dictionnary.h @@ -0,0 +1,13 @@ +#ifndef __DICTIONNARY_H_ +#define __DICTIONNARY_H_ +#include <stdint.h> + +typedef void dic_t; + +dic_t *NewDictionnary(); +void FreeDictionnary(dic_t **dic); + +const char* AddDictionnary(dic_t* dic, const char* s); +int ExistDictionnary(dic_t* dic, const char* s); + +#endif //__DICTIONNARY_H_ \ No newline at end of file diff --git a/src/include/elfload_dump.h b/src/include/elfload_dump.h index 251ea3b8..ce0e9c1b 100755 --- a/src/include/elfload_dump.h +++ b/src/include/elfload_dump.h @@ -6,7 +6,7 @@ typedef struct elfheader_s elfheader_t; const char* DumpSection(Elf64_Shdr *s, char* SST); const char* DumpDynamic(Elf64_Dyn *s); const char* DumpPHEntry(Elf64_Phdr *e); -const char* DumpSym(elfheader_t *h, Elf64_Sym* sym); +const char* DumpSym(elfheader_t *h, Elf64_Sym* sym, int version); const char* DumpRelType(int t); const char* SymName(elfheader_t *h, Elf64_Sym* sym); const char* IdxSymName(elfheader_t *h, int sym); diff --git a/src/include/elfloader.h b/src/include/elfloader.h index aef5ae35..df745aa2 100755 --- a/src/include/elfloader.h +++ b/src/include/elfloader.h @@ -55,4 +55,9 @@ void CreateMemorymapFile(box64context_t* context, int fd); int ElfCheckIfUseTCMallocMinimal(elfheader_t* h); // return 1 if tcmalloc is used +const char* GetSymbolVersion(elfheader_t* h, int version); +const char* GetParentSymbolVersion(elfheader_t* h, int index); +const char* VersionnedName(const char* name, int ver, const char* vername); +int SameVersionnedSymbol(const char* name1, int ver1, const char* vername1, const char* name2, int ver2, const char* vername2); + #endif //__ELF_LOADER_H_ diff --git a/src/include/librarian.h b/src/include/librarian.h index 37eda132..522c98b6 100755 --- a/src/include/librarian.h +++ b/src/include/librarian.h @@ -24,24 +24,18 @@ kh_mapsymbols_t* GetMapSymbol(lib_t* maplib); kh_mapsymbols_t* GetWeakSymbol(lib_t* maplib); kh_mapsymbols_t* GetLocalSymbol(lib_t* maplib); kh_mapsymbols_t* GetGlobalData(lib_t* maplib); -int AddNeededLib(lib_t* maplib, needed_libs_t* neededlibs, library_t *deplib, int local, const char* path, box64context_t* box64, x64emu_t* emu); // 0=success, 1=error +int AddNeededLib(lib_t* maplib, needed_libs_t* neededlibs, library_t *deplib, int local, const char** paths, int npath, box64context_t* box64, x64emu_t* emu); // 0=success, 1=error library_t* GetLibMapLib(lib_t* maplib, const char* name); library_t* GetLibInternal(const char* name); -uintptr_t FindGlobalSymbol(lib_t *maplib, const char* name); -int GetNoSelfSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t* self); -int GetSelfSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t *self); -int GetGlobalSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end); -int GetGlobalNoWeakSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end); -int GetLocalSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t *self); -int GetNoWeakSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t *self); -elfheader_t* GetGlobalSymbolElf(lib_t *maplib, const char* name); -int IsGlobalNoWeakSymbolInNative(lib_t *maplib, const char* name); - -void AddSymbol(kh_mapsymbols_t *mapsymbols, const char* name, uintptr_t addr, uint64_t sz); // replace if already there -uintptr_t FindSymbol(kh_mapsymbols_t *mapsymbols, const char* name); -void AddWeakSymbol(kh_mapsymbols_t *mapsymbols, const char* name, uintptr_t addr, uint64_t sz); // don't add if already there -int GetSymbolStartEnd(kh_mapsymbols_t* mapsymbols, const char* name, uintptr_t* start, uintptr_t* end); -const char* GetSymbolName(kh_mapsymbols_t* mapsymbols, void* p, uintptr_t* offs, uint64_t* sz); +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, int version, const char* vername); +int GetSelfSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t *self, int version, const char* vername); +int GetGlobalSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t *self, int version, const char* vername); +int GetGlobalNoWeakSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, int version, const char* vername); +int GetLocalSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t *self, int version, const char* vername); +int GetNoWeakSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t *self, int version, const char* vername); +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* FindSymbolName(lib_t *maplib, void* p, void** start, uint64_t* sz, const char** libname, void** base); diff --git a/src/include/library.h b/src/include/library.h index 26f395dc..64f376ec 100755 --- a/src/include/library.h +++ b/src/include/library.h @@ -1,6 +1,7 @@ #ifndef __LIBRARY_H_ #define __LIBRARY_H_ #include <stdint.h> +#include "symbols.h" typedef struct library_s library_t; typedef struct lib_s lib_t; @@ -18,9 +19,9 @@ void Free1Library(library_t **lib, x64emu_t* emu); char* GetNameLib(library_t *lib); int IsSameLib(library_t* lib, const char* path); // check if lib is same (path -> name) -int GetLibSymbolStartEnd(library_t* lib, const char* name, uintptr_t* start, uintptr_t* end); -int GetLibNoWeakSymbolStartEnd(library_t* lib, const char* name, uintptr_t* start, uintptr_t* end); -int GetLibLocalSymbolStartEnd(library_t* lib, const char* name, uintptr_t* start, uintptr_t* end); +int GetLibSymbolStartEnd(library_t* lib, const char* name, uintptr_t* start, uintptr_t* end, int version, const char* vername, int local); +int GetLibNoWeakSymbolStartEnd(library_t* lib, const char* name, uintptr_t* start, uintptr_t* end, int version, const char* vername, int local); +int GetLibLocalSymbolStartEnd(library_t* lib, const char* name, uintptr_t* start, uintptr_t* end, int version, const char* vername, int local); void fillGLProcWrapper(box64context_t* context); void freeGLProcWrapper(box64context_t* context); void fillALProcWrapper(box64context_t* context); diff --git a/src/include/symbols.h b/src/include/symbols.h new file mode 100644 index 00000000..49cd40f0 --- /dev/null +++ b/src/include/symbols.h @@ -0,0 +1,24 @@ +#ifndef __SYMBOLS_PRIVATE_H_ +#define __SYMBOLS_PRIVATE_H_ +#include <stdint.h> + +#include "custommem.h" +#include "khash.h" + +typedef struct versymbols_s versymbols_t; + +KHASH_MAP_DECLARE_STR(mapsymbols, versymbols_t) + +kh_mapsymbols_t* NewMapSymbols(); +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); +// don't add if already there + +void AddWeakSymbol(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* GetSymbolName(kh_mapsymbols_t* mapsymbols, void* p, uintptr_t* offs, uint32_t* sz, const char** vername); + +#endif //__SYMBOLS_PRIVATE_H_ \ No newline at end of file diff --git a/src/include/wrappedlibs.h b/src/include/wrappedlibs.h index 41e27765..f78dcfb2 100755 --- 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); +typedef int (*wrappedlib_get_t)(library_t* lib, const char* name, uintptr_t *offs, uintptr_t *sz, int version, const char* vername, int local); typedef struct wrappedlib_s { const char* name; |