>>What could be the reason for Init function not called?
I don't know, use your imagination.
Set the STM32 Cube Programmer side to Verbose Logging Level 3, see what it's doing.
Make sure it pulls in the loader image to RAM, that it correctly identifies the Init() entry point, and calls it. Use objdump or fromelf to dump/disassemble the .STLDR
Other H5 loaders use 0x20003004 as the basis, not 0x20000004 or 0x24000004
C:\STM32Cube\STM32CubeProgrammer_v2.15.0\bin\ExternalLoader>C:\Keil537\ARM\ARMCLANG\bin\fromelf.exe -csd MX25LM51245G_STM32H573I-DK.stldr
========================================================================
** ELF Header Information
File Name: MX25LM51245G_STM32H573I-DK.stldr
Machine class: ELFCLASS32 (32-bit)
Data encoding: ELFDATA2LSB (Little endian)
Header version: EV_CURRENT (Current version)
Operating System ABI: none
ABI Version: 0
File Type: ET_EXEC (Executable) (2)
Machine: EM_ARM (ARM)
Image Entry point: 0x20003005
Flags: None (0x05000000)
ARM ELF revision: 5 (ABI version 2)
Conforms to Base float procedure-call standard
Header size: 52 bytes (0x34)
Program header entry size: 32 bytes (0x20)
Section header entry size: 40 bytes (0x28)
Program header entries: 2
Section header entries: 20
Program header offset: 159376 (0x00026e90)
Section header offset: 159440 (0x00026ed0)
Section header string table index: 1
========================================================================
** Program header #0 (PT_LOAD) [PF_R]
Size : 200 bytes
Virtual address: 0x00000000 (Alignment 4)
====================================
** Program header #1 (PT_LOAD) [PF_X + PF_W + PF_R]
Size : 16205 bytes
Virtual address: 0x20003004 (Alignment 4)
========================================================================
...
267 Init 0x20003005 Gb 5 Code De 0x66
268 MassErase 0x2000306b Gb 5 Code De 0x3e
269 Write 0x200030a9 Gb 5 Code De 0x46
270 SectorErase 0x200030ef Gb 5 Code De 0x60
271 CheckSum 0x2000320d Gb 5 Code De 0xd4
272 Verify 0x200032e1 Gb 5 Code De 0x5e
...