Loaders rewrite argv[0] for old binaries (#1170)

For this to work, a loader has to be able to tell the difference between
an ‘old’ and a ‘new’ binary. This is achieved via a repurposing of ELF’s
e_flags field. We previously tried to use the padding in e_ident for it,
but binutils was resetting it to zero in e.g. strip.

This introduces one new ELF flag for cosmopolitan binaries. It is called
`EF_APE_MODERN`. We choose 0x101ca75, "lol cat 5".

It should now be safe to install the ape loader binfmt registration with
the `P` flag.
This commit is contained in:
Jōshin 2024-05-07 17:42:18 -07:00 committed by GitHub
parent 57c0b065c8
commit 7d31fc311a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 27 additions and 3 deletions

View file

@ -327,6 +327,11 @@ static void UseFreebsdOsAbi(void) {
elf->e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
}
static void WriteApeFlags(void) {
/* try to be forward-compatible */
elf->e_flags = (elf->e_flags & ~EF_APE_MODERN_MASK) | EF_APE_MODERN;
}
/**
* Improve GCC11 `-fpatchable-function-entry` codegen.
*
@ -668,6 +673,7 @@ static void FixupObject(void) {
UseFreebsdOsAbi();
}
if (elf->e_type != ET_REL) {
WriteApeFlags();
PurgeIfuncSections();
RelinkZipFiles();
}