Skip to content

Commit d3668e5

Browse files
committed
Build malloc from libcmt for goldp ourselves
1 parent 46a6d4f commit d3668e5

7 files changed

Lines changed: 310 additions & 70 deletions

File tree

.github/workflows/build.yml

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ jobs:
5050
repository: isledecomp/MSVC600-8168
5151
path: msvc600
5252

53+
- uses: actions/checkout@v6
54+
with:
55+
repository: isledecomp/MSVC600-8447
56+
path: msvc600sp3
57+
5358
- name: Setup cmake
5459
uses: jwlawson/actions-setup-cmake@v2
5560
with:
@@ -59,7 +64,7 @@ jobs:
5964
shell: cmd
6065
run: |
6166
call .\msvc600\VC98\Bin\VCVARS32.BAT x86
62-
cmake -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo -G "NMake Makefiles"
67+
cmake "-DMSVC_CRT_SRC_PATH=${{github.workspace}}/msvc600sp3/VC98/crt/src" -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo -G "NMake Makefiles"
6368
cmake --build build
6469
6570
- name: Upload Artifact
@@ -110,8 +115,8 @@ jobs:
110115
- name: Summarize Accuracy
111116
shell: bash
112117
run: |
113-
reccmp-reccmp -S LEGORACERSPROGRESS.SVG --svg-icon assets/legoracers.png --target LEGORACERS --total 3986 --nolib --json LEGORACERSPROGRESS.json --html LEGORACERSPROGRESS.HTML
114-
reccmp-reccmp -S GOLDPPROGRESS.SVG --svg-icon assets/goldp.png --target GOLDP --total 1071 --nolib --json GOLDPPROGRESS.json --html GOLDPPROGRESS.HTML
118+
reccmp-reccmp -S LEGORACERSPROGRESS.SVG --svg-icon assets/legoracers.png --target LEGORACERS --total 3986 --json LEGORACERSPROGRESS.json --html LEGORACERSPROGRESS.HTML
119+
reccmp-reccmp -S GOLDPPROGRESS.SVG --svg-icon assets/goldp.png --target GOLDP --total 1071 --json GOLDPPROGRESS.json --html GOLDPPROGRESS.HTML
115120
116121
- name: Compare Accuracy With Current Master
117122
shell: bash
@@ -121,8 +126,8 @@ jobs:
121126
curl -fLSs -o LEGORACERSPROGRESS-old.json $RELEASE_URL/LEGORACERSPROGRESS.json || echo "" >LEGORACERSPROGRESS-old.json
122127
curl -fLSs -o GOLDPPROGRESS-old.json $RELEASE_URL/GOLDPPROGRESS.json || echo "" >GOLDPPROGRESS-old.json
123128
124-
reccmp-reccmp --target LEGORACERS --nolib --diff LEGORACERSPROGRESS-old.json || echo "Current master not found"
125-
reccmp-reccmp --target GOLDP --nolib --diff GOLDPPROGRESS-old.json || echo "Current master not found"
129+
reccmp-reccmp --target LEGORACERS --diff LEGORACERSPROGRESS-old.json || echo "Current master not found"
130+
reccmp-reccmp --target GOLDP --diff GOLDPPROGRESS-old.json || echo "Current master not found"
126131
127132
- name: Check Vtables
128133
if: ${{ steps.detection.conclusion == 'success' && always() }}

3rdparty/libcmt/CMakeLists.txt

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
add_library(patched-libcmt INTERFACE)
2+
3+
set(MSVC_CRT_SRC_PATH "" CACHE PATH "Path of MSVC6 CRT/SRC")
4+
if(MSVC_CRT_SRC_PATH)
5+
enable_language(C)
6+
set(CMAKE_CXX_FLAGS "/W3 /GX /DWIN32 /D_WINDOWS")
7+
set(CMAKE_CXX_FLAGS_DEBUG "/Gm /Od /D_DEBUG")
8+
set(CMAKE_CXX_FLAGS_RELEASE "/O1 /DNDEBUG")
9+
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/O1 /DNDEBUG")
10+
set(CMAKE_CXX_FLAGS_MINSIZEREL "/Os /DNDEBUG")
11+
12+
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS}")
13+
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
14+
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
15+
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
16+
set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}")
17+
18+
# Compile our SP3 heap overlay as an OBJECT library so we can patch the
19+
# resulting .obj files into a copy of RTM's LIBCMT.LIB.
20+
add_library(goldp_libcmt_objs OBJECT
21+
"${MSVC_CRT_SRC_PATH}/free.c"
22+
"${MSVC_CRT_SRC_PATH}/calloc.c"
23+
"${MSVC_CRT_SRC_PATH}/malloc.c"
24+
"${MSVC_CRT_SRC_PATH}/realloc.c"
25+
"${MSVC_CRT_SRC_PATH}/expand.c"
26+
"${MSVC_CRT_SRC_PATH}/msize.c"
27+
"${MSVC_CRT_SRC_PATH}/sbheap.c"
28+
"${MSVC_CRT_SRC_PATH}/heapinit.c"
29+
"${MSVC_CRT_SRC_PATH}/heapchk.c"
30+
"${MSVC_CRT_SRC_PATH}/heapmin.c"
31+
"${MSVC_CRT_SRC_PATH}/new.cpp"
32+
"${MSVC_CRT_SRC_PATH}/delete.cpp"
33+
)
34+
target_include_directories(goldp_libcmt_objs PRIVATE "${MSVC_CRT_SRC_PATH}")
35+
target_compile_definitions(goldp_libcmt_objs PRIVATE WIN32_LEAN_AND_MEAN NOSERVICE)
36+
target_compile_definitions(goldp_libcmt_objs PRIVATE _MBCS _MB_MAP_DIRECT)
37+
target_compile_definitions(goldp_libcmt_objs PRIVATE _CRTBLD)
38+
target_compile_definitions(goldp_libcmt_objs PRIVATE WINHEAP)
39+
target_compile_options(goldp_libcmt_objs PRIVATE -Zp8 -GFy -GB -Gi- -Zl)
40+
set_property(TARGET goldp_libcmt_objs PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
41+
# Suppress source-level debug info so the PDB doesn't emit S_GPROC32 entries with C-source
42+
# names for CRT internals — this would shadow PUBLIC symbol names and break reccmp's symbol
43+
# resolution for call targets that LR's PDB only knows by linker-decorated name.
44+
set_property(TARGET goldp_libcmt_objs PROPERTY MSVC_DEBUG_INFORMATION_FORMAT "")
45+
46+
message(STATUS "LIB: $ENV{LIB}")
47+
# Locate the LIBCMT.LIB picked up from the LIB env var
48+
set(libs $ENV{LIB})
49+
if(NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
50+
string(REPLACE ":" ";" libs ${libs})
51+
endif()
52+
find_file(LIBCMT_ORIGINAL_LIB NAMES LIBCMT.LIB libcmt.lib HINTS ${libs} REQUIRED)
53+
message(STATUS "Original LIBCMT.LIB: ${LIBCMT_ORIGINAL_LIB}")
54+
55+
# Build a patched LIBCMT.LIB: copy lib, strip heap .obj members, add ours.
56+
set(PATCHED_LIBCMT "${CMAKE_CURRENT_BINARY_DIR}/RACERS_LIBCMT.LIB")
57+
set(PRUNED_LIBCMT "${CMAKE_CURRENT_BINARY_DIR}/PRUNED_LIBCMT.LIB")
58+
add_custom_command(
59+
OUTPUT "${PATCHED_LIBCMT}"
60+
BYPRODUCTS "${PRUNED_LIBCMT}"
61+
DEPENDS goldp_libcmt_objs "${LIBCMT_ORIGINAL_LIB}"
62+
COMMAND "${CMAKE_COMMAND}" -E rm -f "${PATCHED_LIBCMT}" "${PRUNED_LIBCMT}"
63+
COMMAND "${CMAKE_COMMAND}" -E copy "${LIBCMT_ORIGINAL_LIB}" "${PRUNED_LIBCMT}"
64+
COMMAND "${CMAKE_AR}" /nologo
65+
/REMOVE:build\\intel\\mt_obj\\free.obj
66+
/REMOVE:build\\intel\\mt_obj\\calloc.obj
67+
/REMOVE:build\\intel\\mt_obj\\malloc.obj
68+
/REMOVE:build\\intel\\mt_obj\\realloc.obj
69+
/REMOVE:build\\intel\\mt_obj\\expand.obj
70+
/REMOVE:build\\intel\\mt_obj\\msize.obj
71+
/REMOVE:build\\intel\\mt_obj\\sbheap.obj
72+
/REMOVE:build\\intel\\mt_obj\\heapinit.obj
73+
/REMOVE:build\\intel\\mt_obj\\heapchk.obj
74+
/REMOVE:build\\intel\\mt_obj\\heapmin.obj
75+
/REMOVE:build\\intel\\mt_obj\\new.obj
76+
/REMOVE:build\\intel\\mt_obj\\delete.obj
77+
"${PATCHPRUNED_LIBCMTED_LIBCMT}"
78+
COMMAND "${CMAKE_AR}" /nologo /NODEFAULTLIB:LIBCMT.LIB "/OUT:${PATCHED_LIBCMT}" "${PRUNED_LIBCMT}" $<TARGET_OBJECTS:goldp_libcmt_objs>
79+
COMMAND_EXPAND_LISTS
80+
VERBATIM
81+
)
82+
add_custom_target(goldp_libcmt_target DEPENDS "${PATCHED_LIBCMT}")
83+
add_dependencies(goldp goldp_libcmt_target)
84+
85+
# Tell the linker to use our patched LIBCMT instead of RTM's
86+
target_link_options(patched-libcmt INTERFACE "/NODEFAULTLIB:LIBCMT.LIB")
87+
target_link_libraries(patched-libcmt INTERFACE "${PATCHED_LIBCMT}")
88+
endif()

CMakeLists.txt

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -452,11 +452,17 @@ if (MSVC_FOR_DECOMP)
452452
# Embed debug information (/Z7) for Debug and RelWithDebInfo configuration type
453453
set_property(TARGET goldp legoracers common_goldp common_legoracers PROPERTY MSVC_DEBUG_INFORMATION_FORMAT "$<$<CONFIG:Debug,RelWithDebInfo>:Embedded>")
454454

455-
set(CMAKE_CXX_FLAGS "/W3 /GX /D \"WIN32\" /D \"_WINDOWS\"")
456-
set(CMAKE_CXX_FLAGS_DEBUG "/Gm /Od /D \"_DEBUG\"")
457-
set(CMAKE_CXX_FLAGS_RELEASE "/O2 /D \"NDEBUG\"")
458-
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/O2 /D \"NDEBUG\"")
459-
set(CMAKE_CXX_FLAGS_MINSIZEREL "/Os /D \"NDEBUG\"")
455+
set(CMAKE_CXX_FLAGS "/W3 /GX /DWIN32 /D_WINDOWS")
456+
set(CMAKE_CXX_FLAGS_DEBUG "/Gm /Od /D_DEBUG")
457+
set(CMAKE_CXX_FLAGS_RELEASE "/O2 /DNDEBUG")
458+
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/O2 /DNDEBUG")
459+
set(CMAKE_CXX_FLAGS_MINSIZEREL "/Os /DNDEBUG")
460+
461+
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS}")
462+
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
463+
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
464+
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
465+
set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}")
460466

461467
set(CMAKE_EXE_LINKER_FLAGS "/machine:I386")
462468
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/incremental:yes /debug")
@@ -545,8 +551,13 @@ foreach(target ${RECCMP_TARGETS})
545551
add_custom_command(OUTPUT "${progress_local}" COMMAND ${download_command})
546552
add_custom_target(show-progress-${reccmp_id}
547553
COMMENT "Compare progress of ${reccmp_id} with current git master"
548-
COMMAND reccmp-reccmp --target ${reccmp_id} --nolib --diff "${progress_local}"
554+
COMMAND reccmp-reccmp --target ${reccmp_id} --diff "${progress_local}"
549555
DEPENDS "${progress_local}"
550556
)
551557
add_dependencies(show-progress show-progress-${reccmp_id})
552558
endforeach()
559+
560+
if(MSVC_FOR_DECOMP)
561+
add_subdirectory(3rdparty/libcmt)
562+
target_link_libraries(goldp PRIVATE patched-libcmt)
563+
endif()

0 commit comments

Comments
 (0)