mirror of
git://git.musl-libc.org/musl
synced 2025-03-06 20:48:29 +01:00
fix inconsistent signature of __libc_start_main
commit7586360bad
removed the unused arguments from the definition of __libc_start_main, making it incompatible with the declaration at the point of call, which still passed 6 arguments. calls with mismatched function type have undefined behavior, breaking LTO and any other tooling that checks for function signature mismatch. removing the extra arguments from the point of call (crt1) is not an option for fixing this, since that would be a change in ABI surface between application and libc. adding back the extra arguments requires some care. on archs that pass arguments on the stack or that reserve argument spill space for the callee on the stack, it imposes an ABI requirement on the caller to provide such space. the modern crt1.c entry point provides such space, but originally there was arch-specific asm for the call to __libc_start_main. the last of this asm was removed in commit6fef8cafbd
, and manual review of the code removed and its prior history was performed to check that all archs/variants passed the legacy init/fini/ldso_fini arguments.
This commit is contained in:
parent
dd5b638471
commit
9afed99c22
1 changed files with 2 additions and 1 deletions
3
src/env/__libc_start_main.c
vendored
3
src/env/__libc_start_main.c
vendored
|
@ -69,7 +69,8 @@ weak_alias(libc_start_init, __libc_start_init);
|
|||
typedef int lsm2_fn(int (*)(int,char **,char **), int, char **);
|
||||
static lsm2_fn libc_start_main_stage2;
|
||||
|
||||
int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv)
|
||||
int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv,
|
||||
void (*init_dummy)(), void(*fini_dummy)(), void(*ldso_dummy)())
|
||||
{
|
||||
char **envp = argv+argc+1;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue