Skip to content

Instantly share code, notes, and snippets.

@jpluimers
Created August 15, 2016 07:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jpluimers/bc35a0448ba63d76de4ba2b61e8be0e4 to your computer and use it in GitHub Desktop.
Save jpluimers/bc35a0448ba63d76de4ba2b61e8be0e4 to your computer and use it in GitHub Desktop.
Find out which units actually make it into your Delphi EXE file (i.e. not eliminated by the linker)
@echo off
if ["%*"]==[] goto :help
:logic
if not exist %1 goto :notExist
setlocal
:: do not use periods (.) in delims as unit names may contain them!
:: it might be that the segment (%%a) for C=CODE/S=.text/G=(none)/M=*/ACBP=A9 is always 0001
:: it might be that the segment (%%a) for C=ICODE/S=.itext/G=(none)/M=*/ACBP=A9 is always 0002
:: it might be that the segment (%%a) for C=DATA/S=.data/G=DGROUP/M=*/ACBP=A9 is always 0003
:: it might be that the segment (%%a) for C=BSS/S=.bss/G=DGROUP/M=*/ACBP=A9 is always 0004
:: it might be that the segment (%%a) for C=TLS/S=.tls/G=(none)/M=*/ACBP=A9 is always 0005
:: the `if ["%%h"]==["(none)"] ` trick is to prevent this error:
:: ) was unexpected at this time.
for /f "tokens=1,2,3,4,5,6,7,8,9,10,11,12,13,14,* delims=()= " %%a IN (%1) do (
if [%%c]==[C] if [%%e]==[S] if [%%g]==[G] if [%%i]==[M] if [%%k]==[ACBP] if [%%l]==[A9] if [%%m]==[] (
if [%%d]==[CODE] if [%%f]==[.text] if ["%%h"]==["(none)"] echo %%j
if [%%d]==[ICODE] if [%%f]==[.itext] if ["%%h"]==["(none)"] echo %%j
if [%%d]==[DATA] if [%%f]==[.data] if ["%%h"]==["DGROUP"] echo %%j
if [%%d]==[BSS] if [%%f]==[.bss] if ["%%h"]==["DGROUP"] echo %%j
if [%%d]==[TLS] if [%%f]==[.tls] if ["%%h"]==["(none)"] echo %%j
)
if [%%a]==[line] if [%%b]==[numbers] if [%%c]==[for] if [%%f]==[segment] if [%%g]==[.text] if [%%h]==[] (
echo %%d
)
)
endlocal
goto :eof
echo a=%%a;b=%%b;b=%%b;c=%%c;d=%%d;e=%%e;f=%%f;g=%%g;h=%%h;i=%%i;j=%%j;k=%%k;l=%%l;m=%%m;n=%%n
if [%%c]==[C] if [%%d]==[CODE] if [%%e]==[S] if [%%f]==[.text] if [%%g]==[G] if ["%%h"]==["(none)"] if [%%i]==[M] if [%%k]==[ACBP] if [%%l]==[A9] if [%%m]==[] echo %%j
:notExist
echo %* does not exist.
:help
echo syntax: %0 MAP-file
echo will list all the Delphi units that got compiled into your EXE in a non-sorted non-unique way
goto :eof
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment