mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-30 08:18:30 +00:00
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:
parent
57c0b065c8
commit
7d31fc311a
5 changed files with 27 additions and 3 deletions
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue