From 25c32e4bf9afba11aded40374bfda9127831961b Mon Sep 17 00:00:00 2001 From: PQCraft <0456523@gmail.com> Date: Sat, 22 Jul 2023 15:07:18 -0400 Subject: [PATCH] cxbe: Set proper flags on debug sections Another little "hack" to clear the preload flag on sections named .debug or starting with .debug_ so they won't be loaded and waste memory --- tools/cxbe/Main.cpp | 9 +++++---- tools/cxbe/Xbe.cpp | 9 +++++++-- tools/cxbe/Xbe.h | 3 ++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/tools/cxbe/Main.cpp b/tools/cxbe/Main.cpp index 9614b7efe..0f21e9459 100644 --- a/tools/cxbe/Main.cpp +++ b/tools/cxbe/Main.cpp @@ -29,7 +29,8 @@ int main(int argc, char *argv[]) bool bRetail; uint32 dwTitleId = 0xFFFF0002; - uint32 dwRegions; + uint32 dwRegions = XBEIMAGE_GAME_REGION_NA | XBEIMAGE_GAME_REGION_JAPAN | + XBEIMAGE_GAME_REGION_RESTOFWORLD | XBEIMAGE_GAME_REGION_MANUFACTURING; uint32 dwVersion; const char *program = argv[0]; @@ -91,7 +92,7 @@ int main(int argc, char *argv[]) { char titlechar[2]; unsigned titleno; - if (sscanf(szXbeTitleID, "%c%c-%u", &titlechar[0], &titlechar[1], &titleno) != 3) + if(sscanf(szXbeTitleID, "%c%c-%u", &titlechar[0], &titlechar[1], &titleno) != 3) { strncpy(szErrorMessage, "invalid TITLEID", ERROR_LEN); goto cleanup; @@ -192,8 +193,8 @@ int main(int argc, char *argv[]) LogoPtr = &logo; } - Xbe *XbeFile = - new Xbe(ExeFile, szXbeTitle, dwTitleId, dwRegions, dwVersion, bRetail, LogoPtr, szDebugPath); + Xbe *XbeFile = new Xbe( + ExeFile, szXbeTitle, dwTitleId, dwRegions, dwVersion, bRetail, LogoPtr, szDebugPath); if(XbeFile->GetError() != 0) { diff --git a/tools/cxbe/Xbe.cpp b/tools/cxbe/Xbe.cpp index 344c82222..4421c4271 100644 --- a/tools/cxbe/Xbe.cpp +++ b/tools/cxbe/Xbe.cpp @@ -33,7 +33,8 @@ static size_t BasenameOffset(const std::string &path) // construct via Exe file object Xbe::Xbe(class Exe *x_Exe, const char *x_szTitle, uint32 x_dwTitleID, uint32 x_dwRegions, - uint32 x_dwVersion, bool x_bRetail, const std::vector *logo, const char *x_szDebugPath) + uint32 x_dwVersion, bool x_bRetail, const std::vector *logo, + const char *x_szDebugPath) { ConstructorInit(); @@ -394,7 +395,11 @@ Xbe::Xbe(class Exe *x_Exe, const char *x_szTitle, uint32 x_dwTitleID, uint32 x_d (characteristics & IMAGE_SCN_CNT_CODE)) m_SectionHeader[v].dwFlags.bExecutable = true; - m_SectionHeader[v].dwFlags.bPreload = true; + char *name = (x_Exe->m_SectionHeader_longname[v].m_longname) + ? x_Exe->m_SectionHeader_longname[v].m_longname + : (char *)x_Exe->m_SectionHeader[v].m_name; + m_SectionHeader[v].dwFlags.bPreload = + (strcmp(name, ".debug") && strncmp(name, ".debug_", 7)); } m_SectionHeader[v].dwVirtualAddr = diff --git a/tools/cxbe/Xbe.h b/tools/cxbe/Xbe.h index 10a050eb6..fd47a203a 100644 --- a/tools/cxbe/Xbe.h +++ b/tools/cxbe/Xbe.h @@ -27,7 +27,8 @@ class Xbe : public Error public: // construct via Exe file object Xbe(class Exe *x_Exe, const char *x_szTitle, uint32 x_dwTitleID, uint32 x_dwRegions, - uint32 x_dwVersion, bool x_bRetail, const std::vector *logo = nullptr, const char *x_szDebugPath = nullptr); + uint32 x_dwVersion, bool x_bRetail, const std::vector *logo = nullptr, + const char *x_szDebugPath = nullptr); // deconstructor ~Xbe();