ELF is powerful because it provides nice concepts, but it is basically unusable for the TI-Z80, TI-eZ80 and TI-68k series at the very least.
Even on the Nspire series, the experiments showed several horrible size blowups (in the KBs range) on simple things, while others admittedly worked well. This eventually led to the making of a custom executable format for the newest Ndless releases.
BFLT was mentioned by multiple persons and considered, but then it's simplistic and limited, although the 256-library limitation would effectively be less of a problem on a TI-(e)Z80/TI-68k than on a Nspire.
PreOS's documentation of the program formats and RAM_CALLs is quite good:
http://www.yaronet.com/t3?id=11 n, under the sdk/doc folder of the downloaded 7z file.
Obviously, a number of things don't apply to any platform but TI-68k/AMS, but others do: variables ("RAM_CALLs" in TI-68k "kernel" parlance) containing the calculator model, the hardware version (huge differences between TI-68k HW1 and HW2), OS version, LCD width in pixels / height in pixels / width of a line in bytes / full size in bytes. The flash memory base RAM_CALL, for instance, makes less sense on the TI-eZ80 series than on the TI-68k series: 0x200000 for 89 and V200, 0x400000 for 92+, 0x800000 for 89T.
I'd add API/ABI version of the "kernel" / its libraries to those RAM_CALLs relevant to the TI-eZ80 series, possibly with "kernel"-provided functionality for checking version numbers.
Maybe I already wrote some of that in the 84CC or another topic, I don't remember. As before, the goal of my posts is to try and provide some ideas and help reduce wheel reinvention, based on the experience of the TI-68k series, to which the TI-eZ80 series is far more similar than the TI-Z80 series was, over the past nearly 20 years