From 59714766fffd554e9965afef0fccae1041e47afc Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Sat, 2 Dec 2023 11:21:14 -0600 Subject: [PATCH] Split Some Libraries Split base, os, db, and mtx. --- config/GMPE01_00/splits.txt | 134 +++++++++++++++++++++++++++++++++++ config/GMPE01_00/symbols.txt | 68 +++++++++--------- configure.py | 53 ++++++++++++++ 3 files changed, 222 insertions(+), 33 deletions(-) diff --git a/config/GMPE01_00/splits.txt b/config/GMPE01_00/splits.txt index ae05a791..3c8869ec 100644 --- a/config/GMPE01_00/splits.txt +++ b/config/GMPE01_00/splits.txt @@ -232,6 +232,9 @@ game/wipe.c: .sdata start:0x801D35E0 end:0x801D35E8 .sdata2 start:0x801D4EE0 end:0x801D4F08 +dolphin/os/__start.c: + .init start:0x80003100 end:0x80003354 + game/window.c: .text start:0x8004207C end:0x800483A0 .data start:0x80130140 end:0x80130688 @@ -297,6 +300,137 @@ game/flag.c: .text start:0x80058010 end:0x80058228 .bss start:0x80198410 end:0x80198420 +dolphin/PPCArch.c: + .text start:0x800B42F4 end:0x800B439C + +dolphin/os/OS.c: + .text start:0x800B439C end:0x800B4CF8 + .data start:0x8013B560 end:0x8013B720 + .bss start:0x801A5300 end:0x801A5350 + .sbss start:0x801D42B0 end:0x801D42E0 + +dolphin/os/OSAlarm.c: + .text start:0x800B4CF8 end:0x800B53A4 + .sbss start:0x801D42E0 end:0x801D42E8 + +dolphin/os/OSAlloc.c: + .text start:0x800B53A4 end:0x800B5D9C + .data start:0x8013B720 end:0x8013BAB8 + .sdata start:0x801D38B8 end:0x801D38C0 + .sbss start:0x801D42E8 end:0x801D42F8 + +dolphin/os/OSArena.c: + .text start:0x800B5D9C end:0x800B5DBC + .sdata start:0x801D38C0 end:0x801D38C8 + .sbss start:0x801D42F8 end:0x801D4300 + +dolphin/os/OSAudioSystem.c: + .text start:0x800B5DBC end:0x800B6050 + .data start:0x8013BAB8 end:0x8013BB38 + +dolphin/os/OSCache.c: + .text start:0x800B6050 end:0x800B66E8 + .data start:0x8013BB38 end:0x8013BD68 + +dolphin/os/OSContext.c: + .text start:0x800B66E8 end:0x800B6F48 + .data start:0x8013BD68 end:0x8013BF40 + +dolphin/os/OSError.c: + .text start:0x800B6F48 end:0x800B71E4 + .data start:0x8013BF40 end:0x8013C260 + .bss start:0x801A5350 end:0x801A5390 + .sdata start:0x801D38C8 end:0x801D38D0 + +dolphin/os/OSFont.c: + .text start:0x800B71E4 end:0x800B723C + .sdata start:0x801D38D0 end:0x801D38D8 + +dolphin/os/OSInterrupt.c: + .text start:0x800B723C end:0x800B7AA8 + .data start:0x8013C260 end:0x8013C290 + .sbss start:0x801D4300 end:0x801D4318 + +dolphin/os/OSLink.c: + .text start:0x800B7AA8 end:0x800B822C + .data start:0x8013C290 end:0x8013C2E0 + +dolphin/os/OSMessage.c: + .text start:0x800B822C end:0x800B828C + +dolphin/os/OSMemory.c: + .text start:0x800B828C end:0x800B8584 + .data start:0x8013C2E0 end:0x8013C2F0 + +dolphin/os/OSMutex.c: + .text start:0x800B8584 end:0x800B85F4 + +dolphin/os/OSReboot.c: + .text start:0x800B85F4 end:0x800B8800 + .bss start:0x801A53A0 end:0x801A53C0 + .sbss start:0x801D4318 end:0x801D4328 + +dolphin/os/OSReset.c: + .text start:0x800B8800 end:0x800B8BE4 + .sbss start:0x801D4328 end:0x801D4330 + +dolphin/os/OSResetSW.c: + .text start:0x800B8BE4 end:0x800B8F70 + .sbss start:0x801D4330 end:0x801D4350 + +dolphin/os/OSRtc.c: + .text start:0x800B8F70 end:0x800B999C + .bss start:0x801A53C0 end:0x801A5418 + +dolphin/os/OSStopwatch.c: + .text start:0x800B999C end:0x800B9D0C + .data start:0x8013C2F0 end:0x8013C368 + +dolphin/os/OSSync.c: + .text start:0x800B9D0C end:0x800B9D90 + +dolphin/os/OSThread.c: + .text start:0x800B9D90 end:0x800BAE5C + .bss start:0x801A5418 end:0x801A5E00 + .sbss start:0x801D4350 end:0x801D4360 + +dolphin/os/OSTime.c: + .text start:0x800BAE5C end:0x800BB280 + .data start:0x8013C368 end:0x8013C3C8 + +dolphin/os/__ppc_eabi_init.c: + .init start:0x80003354 end:0x800033A8 + .text start:0x800BB280 end:0x800BB314 + +dolphin/db.c: + .text start:0x800BB314 end:0x800BB400 + .data start:0x8013C3C8 end:0x8013C3E0 + .sbss start:0x801D4360 end:0x801D4368 + +dolphin/mtx/mtx.c: + .text start:0x800BB400 end:0x800BBCB0 + .sdata start:0x801D38D8 end:0x801D38E0 + .sdata2 start:0x801D6350 end:0x801D6368 + +dolphin/mtx/mtxvec.c: + .text start:0x800BBCB0 end:0x800BBDE4 + +dolphin/mtx/mtx44.c: + .text start:0x800BBDE4 end:0x800BBF4C + .sdata2 start:0x801D6368 end:0x801D6380 + +dolphin/mtx/vec.c: + .text start:0x800BBF4C end:0x800BC2C4 + .sdata2 start:0x801D6380 end:0x801D6390 + +dolphin/mtx/quat.c: + .text start:0x800BC2C4 end:0x800BC710 + .rodata start:0x8011E430 end:0x8011E440 + .sdata2 start:0x801D6390 end:0x801D63B8 + +dolphin/mtx/psmtx.c: + .text start:0x800BC710 end:0x800BC9E8 + Runtime.PPCEABI.H/global_destructor_chain.c: .text start:0x800E2008 end:0x800E2068 .dtors start:0x8011DCE8 end:0x8011DCEC diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 899d8f48..9f61b681 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -2100,7 +2100,7 @@ __OSContextInit = .text:0x800B6F00; // type:function size:0x48 scope:global OSReport = .text:0x800B6F48; // type:function size:0x80 scope:global OSSetErrorHandler = .text:0x800B6FC8; // type:function size:0x1C scope:global __OSUnhandledException = .text:0x800B6FE4; // type:function size:0x200 scope:global -fn_800B71E4 = .text:0x800B71E4; // type:function size:0x58 +OSGetFontEncode = .text:0x800B71E4; // type:function size:0x58 OSDisableInterrupts = .text:0x800B723C; // type:function size:0x14 scope:global OSEnableInterrupts = .text:0x800B7250; // type:function size:0x14 scope:global OSRestoreInterrupts = .text:0x800B7264; // type:function size:0x24 scope:global @@ -2129,8 +2129,7 @@ Config48MB = .text:0x800B83CC; // type:function size:0x80 scope:local RealMode = .text:0x800B844C; // type:function size:0x18 scope:local __OSInitMemoryProtection = .text:0x800B8464; // type:function size:0x120 scope:global __OSUnlockAllMutex = .text:0x800B8584; // type:function size:0x70 -fn_800B85F4 = .text:0x800B85F4; // type:function size:0x2C -Run = .text:0x800B8620; // type:function size:0x14 scope:local +Run = .text:0x800B85F4; // type:function size:0x40 scope:local Callback = .text:0x800B8634; // type:function size:0xC scope:local __OSReboot = .text:0x800B8640; // type:function size:0x1C0 scope:global OSRegisterResetFunction = .text:0x800B8800; // type:function size:0x84 scope:global @@ -2440,7 +2439,7 @@ __GXWriteFifoIntReset = .text:0x800C959C; // type:function size:0x4C __GXCleanGPFifo = .text:0x800C95E8; // type:function size:0xFC GXGetCPUFifo = .text:0x800C96E4; // type:function size:0x8 GXGetGPFifo = .text:0x800C96EC; // type:function size:0x8 -fn_800C96F4 = .text:0x800C96F4; // type:function size:0x158 +__GXXfVtxSpecs = .text:0x800C96F4; // type:function size:0x158 GXSetVtxDesc = .text:0x800C984C; // type:function size:0x360 __GXSetVCD = .text:0x800C9BAC; // type:function size:0x54 __GXCalculateVLim = .text:0x800C9C00; // type:function size:0x124 @@ -2523,8 +2522,8 @@ GXInitTlutRegion = .text:0x800CD03C; // type:function size:0x48 scope:global GXInvalidateTexAll = .text:0x800CD084; // type:function size:0x48 GXSetTexRegionCallback = .text:0x800CD0CC; // type:function size:0x14 GXSetTlutRegionCallback = .text:0x800CD0E0; // type:function size:0x14 -fn_800CD0F4 = .text:0x800CD0F4; // type:function size:0x9C -fn_800CD190 = .text:0x800CD190; // type:function size:0xCC +GXSetTexCoordScaleManually = .text:0x800CD0F4; // type:function size:0x9C +__SetSURegs = .text:0x800CD190; // type:function size:0xCC scope:local __GXSetSUTexRegs = .text:0x800CD25C; // type:function size:0x17C __GXSetTmemConfig = .text:0x800CD3D8; // type:function size:0x240 scope:global GXSetTevIndirect = .text:0x800CD618; // type:function size:0x9C @@ -2535,7 +2534,7 @@ GXSetNumIndStages = .text:0x800CDB20; // type:function size:0x2C GXSetTevDirect = .text:0x800CDB4C; // type:function size:0x48 GXSetTevIndWarp = .text:0x800CDB94; // type:function size:0x64 GXSetTevIndTile = .text:0x800CDBF8; // type:function size:0x1AC -fn_800CDDA4 = .text:0x800CDDA4; // type:function size:0xCC +__GXUpdateBPMask = .text:0x800CDDA4; // type:function size:0xCC __GXFlushTextureState = .text:0x800CDE70; // type:function size:0x24 scope:global GXSetTevOp = .text:0x800CDE94; // type:function size:0x1A4 GXSetTevColorIn = .text:0x800CE038; // type:function size:0x80 @@ -2565,7 +2564,7 @@ GXSetDither = .text:0x800CEEC8; // type:function size:0x40 GXSetDstAlpha = .text:0x800CEF08; // type:function size:0x54 GXSetFieldMask = .text:0x800CEF5C; // type:function size:0x38 GXSetFieldMode = .text:0x800CEF94; // type:function size:0x80 -fn_800CF014 = .text:0x800CF014; // type:function size:0x4 +__GXSetRange = .text:0x800CF014; // type:function size:0x4 GXBeginDisplayList = .text:0x800CF018; // type:function size:0xC8 GXEndDisplayList = .text:0x800CF0E0; // type:function size:0xD4 GXCallDisplayList = .text:0x800CF1B4; // type:function size:0x70 @@ -2662,7 +2661,7 @@ __CARDFormatRegionAsync = .text:0x800D5378; // type:function size:0x658 CARDFormat = .text:0x800D59D0; // type:function size:0x54 __CARDCompareFileName = .text:0x800D5A24; // type:function size:0x68 __CARDAccess = .text:0x800D5A8C; // type:function size:0x98 -fn_800D5B24 = .text:0x800D5B24; // type:function size:0x30 +__CARDIsPublic = .text:0x800D5B24; // type:function size:0x30 __CARDGetFileNo = .text:0x800D5B54; // type:function size:0x150 CARDOpen = .text:0x800D5CA4; // type:function size:0x178 CARDClose = .text:0x800D5E1C; // type:function size:0x54 @@ -2964,7 +2963,7 @@ acosf = .text:0x800EBB90; // type:function size:0x24 TRKNubMainLoop = .text:0x800EBBB4; // type:function size:0xF8 scope:global TRKDestructEvent = .text:0x800EBCAC; // type:function size:0x24 scope:global TRKConstructEvent = .text:0x800EBCD0; // type:function size:0x18 -fn_800EBCE8 = .text:0x800EBCE8; // type:function size:0xE0 +TRKPostEvent = .text:0x800EBCE8; // type:function size:0xE0 TRKGetNextEvent = .text:0x800EBDC8; // type:function size:0xB4 scope:global TRKInitializeEventQueue = .text:0x800EBE7C; // type:function size:0x58 scope:global TRKNubWelcome = .text:0x800EBED4; // type:function size:0x28 scope:global @@ -5265,6 +5264,7 @@ jumptable_8013B4F4 = .data:0x8013B4F4; // type:object size:0x20 scope:local lbl_8013B518 = .data:0x8013B518; // type:object size:0x24 data:string lbl_8013B53C = .data:0x8013B53C; // type:object size:0x24 data:string @84 = .data:0x8013B560; // type:object size:0x1E scope:local data:string +__OSExceptionLocations = .data:0x8013B648; // type:object size:0x3C lbl_8013B720 = .data:0x8013B720; // type:object size:0x398 DSPInitCode = .data:0x8013BAB8; // type:object size:0x80 scope:local @69 = .data:0x8013BB38; // type:object size:0x29 scope:local data:string @@ -5272,13 +5272,13 @@ lbl_8013BD68 = .data:0x8013BD68; // type:object size:0x1B4 @74 = .data:0x8013BF1C; // type:object size:0x23 scope:local data:string @10 = .data:0x8013BF40; // type:object size:0x16 scope:local data:string @43 = .data:0x8013C21C; // type:object size:0x40 scope:local -lbl_8013C260 = .data:0x8013C260; // type:object size:0x30 data:4byte +InterruptPrioTable = .data:0x8013C260; // type:object size:0x2C scope:local data:4byte lbl_8013C290 = .data:0x8013C290; // type:object size:0x28 lbl_8013C2B8 = .data:0x8013C2B8; // type:object size:0x28 ResetFunctionInfo = .data:0x8013C2E0; // type:object size:0x10 scope:local lbl_8013C2F0 = .data:0x8013C2F0; // type:object size:0x78 -lbl_8013C368 = .data:0x8013C368; // type:object size:0x30 -lbl_8013C398 = .data:0x8013C398; // type:object size:0x30 +YearDays = .data:0x8013C368; // type:object size:0x30 scope:local +LeapYearDays = .data:0x8013C398; // type:object size:0x30 scope:local lbl_8013C3C8 = .data:0x8013C3C8; // type:object size:0x18 data:string lbl_8013C3E0 = .data:0x8013C3E0; // type:object size:0xC8 data:string lbl_8013C4A8 = .data:0x8013C4A8; // type:object size:0x38 @@ -5525,14 +5525,18 @@ lbl_801A4D58 = .bss:0x801A4D58; // type:object size:0x10 data:float lbl_801A4D68 = .bss:0x801A4D68; // type:object size:0x500 data:byte lbl_801A5268 = .bss:0x801A5268; // type:object size:0x80 lbl_801A52E8 = .bss:0x801A52E8; // type:object size:0x18 data:4byte -DriveInfo = .bss:0x801A5300; // type:object size:0x20 scope:local +DriveInfo = .bss:0x801A5300; // type:object size:0x20 scope:local align:32 +DriveBlock = .bss:0x801A5320; // type:object size:0x30 scope:local __OSErrorTable = .bss:0x801A5350; // type:object size:0x40 scope:global -lbl_801A53A0 = .bss:0x801A53A0; // type:object size:0x20 -Scb = .bss:0x801A53C0; // type:object size:0x54 scope:local data:4byte +Header = .bss:0x801A53A0; // type:object size:0x20 scope:local align:32 +Scb = .bss:0x801A53C0; // type:object size:0x54 scope:local align:32 data:4byte RunQueue = .bss:0x801A5418; // type:object size:0x100 scope:local data:4byte +IdleThread = .bss:0x801A5518; // type:object size:0x318 scope:local align:8 data:4byte +DefaultThread = .bss:0x801A5830; // type:object size:0x318 scope:local align:8 data:4byte +IdleContext = .bss:0x801A5B48; // type:object size:0x2B8 scope:local align:8 data:4byte CommandList = .bss:0x801A5E00; // type:object size:0x3C scope:local data:4byte AlarmForTimeout = .bss:0x801A5E68; // type:object size:0x28 scope:local -tmpBuffer = .bss:0x801A5EE0; // type:object size:0x80 scope:local +tmpBuffer = .bss:0x801A5EE0; // type:object size:0x80 scope:local align:32 DummyCommandBlock = .bss:0x801A5F60; // type:object size:0x30 scope:local WaitingQueue = .bss:0x801A5FB8; // type:object size:0x20 scope:local data:4byte bb2Buf = .bss:0x801A5FD8; // type:object size:0x3F scope:local @@ -5872,8 +5876,8 @@ lbl_801D38B6 = .sdata:0x801D38B6; // type:object size:0x2 data:2byte __OSCurrHeap = .sdata:0x801D38B8; // type:object size:0x8 data:4byte __OSArenaLo = .sdata:0x801D38C0; // type:object size:0x4 scope:local data:4byte @32 = .sdata:0x801D38C8; // type:object size:0x2 scope:local data:string -lbl_801D38D0 = .sdata:0x801D38D0; // type:object size:0x8 data:2byte -lbl_801D38D8 = .sdata:0x801D38D8; // type:object size:0x8 +fontEncode$80 = .sdata:0x801D38D0; // type:object size:0x8 scope:local data:2byte +Unit01 = .sdata:0x801D38D8; // type:object size:0x8 lbl_801D38E0 = .sdata:0x801D38E0; // type:object size:0x8 data:4byte lbl_801D38E8 = .sdata:0x801D38E8; // type:object size:0x8 data:string autoInvalidation = .sdata:0x801D38F0; // type:object size:0x4 scope:local data:4byte @@ -6509,26 +6513,24 @@ __OSSavedRegionStart = .sbss:0x801D42CC; // type:object size:0x4 scope:global da __OSInIPL = .sbss:0x801D42D0; // type:object size:0x4 scope:global data:4byte __OSStartTime = .sbss:0x801D42D8; // type:object size:0x8 scope:global data:4byte AlarmQueue = .sbss:0x801D42E0; // type:object size:0x8 scope:local data:4byte -lbl_801D42E8 = .sbss:0x801D42E8; // type:object size:0x4 data:4byte -lbl_801D42EC = .sbss:0x801D42EC; // type:object size:0x4 data:4byte -lbl_801D42F0 = .sbss:0x801D42F0; // type:object size:0x4 data:4byte -lbl_801D42F4 = .sbss:0x801D42F4; // type:object size:0x4 data:4byte +HeapArray = .sbss:0x801D42E8; // type:object size:0x4 scope:local data:4byte +NumHeaps = .sbss:0x801D42EC; // type:object size:0x4 scope:local data:4byte +ArenaStart = .sbss:0x801D42F0; // type:object size:0x4 scope:local data:4byte +ArenaEnd = .sbss:0x801D42F4; // type:object size:0x4 scope:local data:4byte __OSArenaHi = .sbss:0x801D42F8; // type:object size:0x4 scope:local data:4byte InterruptHandlerTable = .sbss:0x801D4300; // type:object size:0x4 scope:local data:4byte __OSLastInterruptSrr0 = .sbss:0x801D4304; // type:object size:0x4 scope:global data:4byte __OSLastInterrupt = .sbss:0x801D4308; // type:object size:0x2 scope:global data:2byte __OSLastInterruptTime = .sbss:0x801D4310; // type:object size:0x8 scope:global data:4byte -lbl_801D4318 = .sbss:0x801D4318; // type:object size:0x4 data:4byte -lbl_801D431C = .sbss:0x801D431C; // type:object size:0x4 data:4byte -lbl_801D4320 = .sbss:0x801D4320; // type:object size:0x8 data:4byte +SaveStart = .sbss:0x801D4318; // type:object size:0x4 scope:local data:4byte +SaveEnd = .sbss:0x801D431C; // type:object size:0x4 scope:local data:4byte +Prepared = .sbss:0x801D4320; // type:object size:0x8 scope:local data:4byte ResetFunctionQueue = .sbss:0x801D4328; // type:object size:0x8 scope:local data:4byte -lbl_801D4330 = .sbss:0x801D4330; // type:object size:0x4 data:4byte -lbl_801D4334 = .sbss:0x801D4334; // type:object size:0x4 data:4byte -lbl_801D4338 = .sbss:0x801D4338; // type:object size:0x8 data:4byte -lbl_801D4340 = .sbss:0x801D4340; // type:object size:0x4 data:4byte -lbl_801D4344 = .sbss:0x801D4344; // type:object size:0x4 data:4byte -lbl_801D4348 = .sbss:0x801D4348; // type:object size:0x4 data:4byte -lbl_801D434C = .sbss:0x801D434C; // type:object size:0x4 data:4byte +ResetCallback = .sbss:0x801D4330; // type:object size:0x4 data:4byte +Down = .sbss:0x801D4334; // type:object size:0x4 data:4byte +LastState = .sbss:0x801D4338; // type:object size:0x8 data:4byte +HoldUp = .sbss:0x801D4340; // type:object size:0x8 align:8 data:4byte +HoldDown = .sbss:0x801D4348; // type:object size:0x8 align:8 data:4byte RunQueueBits = .sbss:0x801D4350; // type:object size:0x4 scope:local data:4byte RunQueueHint = .sbss:0x801D4354; // type:object size:0x4 scope:local data:4byte Reschedule = .sbss:0x801D4358; // type:object size:0x4 scope:local data:4byte diff --git a/configure.py b/configure.py index 09208a40..039fee02 100755 --- a/configure.py +++ b/configure.py @@ -191,6 +191,7 @@ cflags_game = [ "-fp_contract off", ] + config.linker_version = "GC/2.6" config.rel_strip_partial = False config.rel_empty_file = "REL/empty.c" @@ -279,6 +280,58 @@ config.libs = [ Object(NonMatching, "game/flag.c"), ], }, + DolphinLib( + "base", + [ + Object(NonMatching, "dolphin/PPCArch.c"), + ], + ), + DolphinLib( + "os", + [ + Object(NonMatching, "dolphin/os/OS.c"), + Object(NonMatching, "dolphin/os/OSAlarm.c"), + Object(NonMatching, "dolphin/os/OSAlloc.c"), + Object(NonMatching, "dolphin/os/OSArena.c"), + Object(NonMatching, "dolphin/os/OSAudioSystem.c"), + Object(NonMatching, "dolphin/os/OSCache.c"), + Object(NonMatching, "dolphin/os/OSContext.c"), + Object(NonMatching, "dolphin/os/OSError.c"), + Object(NonMatching, "dolphin/os/OSFont.c"), + Object(NonMatching, "dolphin/os/OSInterrupt.c"), + Object(NonMatching, "dolphin/os/OSLink.c"), + Object(NonMatching, "dolphin/os/OSMessage.c"), + Object(NonMatching, "dolphin/os/OSMemory.c"), + Object(NonMatching, "dolphin/os/OSMutex.c"), + Object(NonMatching, "dolphin/os/OSReboot.c"), + Object(NonMatching, "dolphin/os/OSReset.c"), + Object(NonMatching, "dolphin/os/OSResetSW.c"), + Object(NonMatching, "dolphin/os/OSRtc.c"), + Object(NonMatching, "dolphin/os/OSStopwatch.c"), + Object(NonMatching, "dolphin/os/OSSync.c"), + Object(NonMatching, "dolphin/os/OSThread.c"), + Object(NonMatching, "dolphin/os/OSTime.c"), + Object(NonMatching, "dolphin/os/__start.c"), + Object(NonMatching, "dolphin/os/__ppc_eabi_init.c"), + ], + ), + DolphinLib( + "db", + [ + Object(NonMatching, "dolphin/db.c"), + ], + ), + DolphinLib( + "mtx", + [ + Object(NonMatching, "dolphin/mtx/mtx.c"), + Object(NonMatching, "dolphin/mtx/mtxvec.c"), + Object(NonMatching, "dolphin/mtx/mtx44.c"), + Object(NonMatching, "dolphin/mtx/vec.c"), + Object(NonMatching, "dolphin/mtx/quat.c"), + Object(NonMatching, "dolphin/mtx/psmtx.c"), + ], + ), { "lib": "Runtime.PPCEABI.H", "mw_version": config.linker_version,