diff --git a/tools/gdc-psyfork/example-scripts/gdc_core.sh b/tools/gdc-psyfork/example-scripts/gdc_core.sh index c4725b8d..e2f5b179 100644 --- a/tools/gdc-psyfork/example-scripts/gdc_core.sh +++ b/tools/gdc-psyfork/example-scripts/gdc_core.sh @@ -8,6 +8,9 @@ ENGINE_BIN=${ENGINE_PATH}/bin/engine GAME_BIN=${ENGINE_PATH}/${GAME_DIR}/bin/server STEAMINF=${ENGINE_PATH}/${GAME_DIR}/steam.inf +GDC_PATH=${SM_PATH}/tools/gdc-psyfork +GDC_BIN=${GDC_PATH}/Release/gdc + if [ "${GAMEDATA_DIR}" == "" ] ; then GAMEDATA_DIR=${GAME_DIR} fi @@ -107,16 +110,34 @@ cd ${SM_PATH}/tools/gdc-psyfork hg pull -u echo -e "\n" + +cd ${ENGINE_PATH} + for i in "${gamedata_files[@]}" do - ./Release/gdc \ - -g ${GAME_DIR} \ - -e ${ENGINE_NAME} \ - -f ${SM_PATH}/gamedata/$i \ - -b ${GAME_BIN}${BIN_EXT}.so \ - -x ${ENGINE_BIN}${BIN_EXT}.so \ - -w ${GAME_BIN}.dll \ - -y ${ENGINE_BIN}.dll + NO_SYMTABLE= + + readelf --sections ${GAME_BIN}${BIN_EXT}.so | grep --quiet .symtab + if [ "${PIPESTATUS[1]}" != "0" ] ; then + NO_SYMTABLE=" -n" + fi + + readelf --sections ${GAME_BIN}${BIN_EXT}.so | grep --quiet .strtab + if [ "${PIPESTATUS[1]}" != "0" ] ; then + NO_SYMTABLE=" -n" + fi + + # having an issue upon exit after loading some source2007 server bins, invalid free in sendtable dtor, idk. suppress. + MALLOC_CHECK_=0 ${GDC_BIN} \ + -g ${GAMEDATA_DIR} \ + -e ${ENGINE_NAME} \ + -f ${SM_PATH}/gamedata/$i \ + -b ${GAME_BIN}${BIN_EXT}.so \ + -x ${ENGINE_BIN}${BIN_EXT}.so \ + -w ${GAME_BIN}.dll \ + -y ${ENGINE_BIN}.dll \ + -s ${GDC_PATH}/symbols.txt \ + ${NO_SYMTABLE} echo -e "------------------------------------------------------\n" done diff --git a/tools/gdc-psyfork/gdc.cpp b/tools/gdc-psyfork/gdc.cpp index 9e2c31f4..e6337766 100644 --- a/tools/gdc-psyfork/gdc.cpp +++ b/tools/gdc-psyfork/gdc.cpp @@ -16,12 +16,23 @@ char *game_binary = NULL; char *engine_binary = NULL; char *wgame_binary = NULL; char *wengine_binary = NULL; +char *symbols_file = NULL; + +bool use_symtab = true; inline bool IsDigit( char c ) { return c < 58 && c > 47; } +void PrintUsage() +{ + printf("Usage: ./gdc -g -e -f -b -x -w -y [-s ]\n"); + printf("Other options:\n"); + printf(" -d\tAdd debug output\n"); + printf(" -n\tDon't use symbol table for lookups (falls back to dlsym)\n"); +} + int main(int argc, char **argv) { char *gamedata = NULL; @@ -29,12 +40,18 @@ int main(int argc, char **argv) opterr = 0; int opt; - while ((opt = getopt(argc, argv, "b:de:f:g:x:w:y:")) != -1) + while ((opt = getopt(argc, argv, "b:nde:f:g:x:w:y:s:")) != -1) + { switch (opt) { case 'd': debug = true; break; + + case 'n': + use_symtab = false; + break; + case 'g': game = optarg; break; @@ -63,18 +80,23 @@ int main(int argc, char **argv) wengine_binary = optarg; break; + case 's': + symbols_file = optarg; + break; + case '?': - printf("Usage: ./gdc -g -e -f -b -x -w -y \n"); + PrintUsage(); return 0; default: printf("WHAT\n"); return 0; } + } if (!game || !engine || !gamedata || !game_binary || !engine_binary || !wgame_binary || !wengine_binary) { - printf("Usage: ./gdc -g -e -f -b -x -w -y \n"); + PrintUsage(); return 0; } @@ -125,7 +147,7 @@ int main(int argc, char **argv) } CGameConfig symbols; - if (!symbols.EnterFile("symbols.txt", err, sizeof(err))) + if (!symbols.EnterFile(symbols_file ? symbols_file : "symbols.txt", err, sizeof(err))) { printf("symbols.txt: %s\n", err); return 0; @@ -178,8 +200,17 @@ int main(int argc, char **argv) int newOffset; if (symvt[0]) { - void **newvt = (void**) mu.ResolveSymbol(ghandle, symvt); - if (!newvt) + void **newvt = NULL; + if( use_symtab ) + { + newvt = (void**)mu.ResolveSymbol(ghandle, symvt); + } + else + { + newvt = (void **)dlsym(ghandle, symvt); + } + + if (!newvt) { printf("? O: %-22s - can't find, skipping\n", symvt); continue; @@ -362,13 +393,15 @@ int checkSigStringW(int file, const char* symbol) int checkSigStringL(void *handle, const char* symbol) { - bool isAt = (symbol[0] == '@'); + bool isAt = (symbol[0] == '@' && symbol[1] != '\0'); int matches = 0; bool dummy; if (isAt) { - if( mu.ResolveSymbol(handle, symbol + 1) ) + if( use_symtab && mu.ResolveSymbol(handle, &symbol[1]) ) + matches = 1; + else if( !use_symtab && dlsym(handle, &symbol[1]) ) matches = 1; } else @@ -403,15 +436,30 @@ void findFuncPos(const char *sym, int &func, int ¶ms) int findVFunc(void *handle, void **vt, const char *symbol) { - int offset = 1; + if( !use_symtab ) + { + for (int i = 0; i < 1000; i++ ) + { + void *pFunc = vt[i]; + if( !pFunc ) + continue; + + if( pFunc == dlsym(handle, symbol ) ) + return i - 2; + } + + return -1; + } + int funcPos, paramPos; findFuncPos(symbol, funcPos, paramPos); - - for (int i = 0; i < 1000; i++) { void *pFunc = vt[i]; + if( !pFunc ) + continue; + const char *s; if (!(s = mu.ResolveAddr(handle, pFunc))) @@ -426,12 +474,11 @@ int findVFunc(void *handle, void **vt, const char *symbol) if (strcmp(s + tempFuncPos, symbol + funcPos) == 0) { - offset = i; - break; + return i - 2; } } - return offset - 2; + return -1; } unsigned int strncopy(char *dest, const char *src, size_t count) diff --git a/tools/gdc-psyfork/symbols.txt b/tools/gdc-psyfork/symbols.txt index f22f7ecc..59622365 100644 --- a/tools/gdc-psyfork/symbols.txt +++ b/tools/gdc-psyfork/symbols.txt @@ -76,6 +76,7 @@ "ShouldGib" "_ZN9CTFPlayer9ShouldGibERK15CTakeDamageInfob" "GetRadius" "_ZN13CTFBaseRocket9GetRadiusEv" "DeflectPlayer" "_ZN13CTFWeaponBase13DeflectPlayerEP9CTFPlayerS1_R6VectorS3_S3_" + "GetDataDescMap" "_ZN11CBaseEntity14GetDataDescMapEv" // CSSDM "IPointsForKill" "_ZN14CTeamplayRules14IPointsForKillEP11CBasePlayerS1_" @@ -84,6 +85,12 @@ // NapalmLagFix "RadiusDamage" "_ZN10CGameRules12RadiusDamageERK15CTakeDamageInfoRK6VectorfiP11CBaseEntity" + + // V + "CTFFlameThrower::FireProjectile" "_ZN16CTFWeaponBaseGun14FireProjectileEP9CTFPlayer" + "CTFFlameThrower::FireFlameRocket" "_ZN16CTFWeaponBaseGun15FireFlameRocketEP9CTFPlayer" + "CTFPlayer::GetMaxHealth" "_ZNK11CBaseEntity12GetMaxHealthEv" + "CBaseEntity::GetBaseEntity" "_ZN11CBaseEntity13GetBaseEntityEv" } "Options" @@ -180,4 +187,17 @@ "GiveNamedItem" "_ZN11CBasePlayer13GiveNamedItemEPKcib" } } + + "#default" + { + "#supported" + { + "game" "synergy" + } + + "Keys" + { + "GiveNamedItem" "_ZN11CBasePlayer13GiveNamedItemEPKcib" + } + } }