If it came down to it, we could let e_ident[EI_OSABI] = 63 be an escape value, and burn another padding byte for more values. But, in the words of Bartleby, I would prefer not to.
For the record, here's a little history I dug up on the OSABI feature, from notes of our gABI discussions between 1998 and 2001:
In the original proposal to add EI_OSABI (around 1998), the field was entirely dependent on the e_machine value:
Byte e_ident[EI_OSABI] identifies the operating system and
ABI to which the object is targeted. Some fields in other
ELF structures have flags and values that have operating
system and/or ABI specific meanings; the interpretation of
those fields is determined by the value of this byte. The
value of this byte must be interpreted differently for each
machine. That is, each value for the e_machine field
determines a set of values for the EI_OSABI byte. Values are
assigned by the ABI processor supplement for each machine.
If the processor supplement does not specify a set of
values, the value 0 shall be used and indicates unspecified.
We added this around 1998, but the value 0 specified SYSV, and we also had HPUX = 1, and STANDALONE = 255.
I had requested the feature as we started joint talks with Intel, SCO, SGI, Sun, IBM, about porting the various OSes to Itanium. We recognized that each OS was going to have its own set of ELF extensions (because we weren't going to accomplish adding *everything* to the gABI), and per-machine flags and attributes weren't sufficient. We at HP were also interested in using that field to distinguish different ABIs that could conceivably be supported by HP-UX (e.g., running Linux executables directly under HP-UX). The STANDALONE value was intended for embedded applications (including the OS kernel) which did not depend on any underlying ABI.
By January 1999, we had added values for NETBSD = 2 (although it was at first labeled "Unspecified), LINUX = 3, SOLARIS = 6, ..., through IRIX = 12. STANDALONE was still defined, and there was no architecture-specific range. During those discussions, it was generally assumed that the field would only be needed for EM_IA_64 (Itanium).
In the July 2000 draft of the gABI, OSABI was completely architecture specific; the psABI was responsible for defining the set of values, and the value 0 meant "unspecified."
The first proposal to reserve separate ranges for gABI and psABI was to make the lower 128 values of the EI_OSABI field for gABI. But we discovered that ARM was already using the value 97 for its psABI, so we agreed to narrow the gABI range to 0-63. By April 2001, 0 had become NONE, and new definitions had been added for FREEBSD, TRU64, MODESTO (Novell), and OPENBSD. STANDALONE had been removed (or relegated to the Itanium psABI), and the architecture-specific range was 64-255.
-cary