mirror of
https://github.com/fluencelabs/musl
synced 2025-04-25 07:12:15 +00:00
add support for program_invocation[_short]_name
this is a bit ugly, and the motivation for supporting it is questionable. however the main factors were: 1. it will be useful to have this for certain internal purposes anyway -- things like syslog. 2. applications can just save argv[0] in main, but it's hard to fix non-portable library code that's depending on being able to get the invocation name without the main application's help.
This commit is contained in:
parent
5c5ac810c3
commit
b4ea63856a
@ -5,6 +5,8 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <features.h>
|
||||||
|
|
||||||
#include <bits/errno.h>
|
#include <bits/errno.h>
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
@ -13,6 +15,10 @@ __attribute__((const))
|
|||||||
int *__errno_location(void);
|
int *__errno_location(void);
|
||||||
#define errno (*__errno_location())
|
#define errno (*__errno_location())
|
||||||
|
|
||||||
|
#ifdef _GNU_SOURCE
|
||||||
|
extern char *program_invocation_short_name, *program_invocation_name;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
10
src/env/__libc_start_main.c
vendored
10
src/env/__libc_start_main.c
vendored
@ -8,8 +8,9 @@ void __init_ldso_ctors(void);
|
|||||||
#define AUX_CNT 38
|
#define AUX_CNT 38
|
||||||
|
|
||||||
extern size_t __hwcap, __sysinfo;
|
extern size_t __hwcap, __sysinfo;
|
||||||
|
extern char *__progname, *__progname_full;
|
||||||
|
|
||||||
void __init_libc(char **envp)
|
void __init_libc(char **envp, char *pn)
|
||||||
{
|
{
|
||||||
size_t i, *auxv, aux[AUX_CNT] = { 0 };
|
size_t i, *auxv, aux[AUX_CNT] = { 0 };
|
||||||
__environ = envp;
|
__environ = envp;
|
||||||
@ -19,6 +20,11 @@ void __init_libc(char **envp)
|
|||||||
__hwcap = aux[AT_HWCAP];
|
__hwcap = aux[AT_HWCAP];
|
||||||
__sysinfo = aux[AT_SYSINFO];
|
__sysinfo = aux[AT_SYSINFO];
|
||||||
|
|
||||||
|
if (pn) {
|
||||||
|
__progname = __progname_full = pn;
|
||||||
|
for (i=0; pn[i]; i++) if (pn[i]=='/') __progname = pn+i+1;
|
||||||
|
}
|
||||||
|
|
||||||
__init_tls(aux);
|
__init_tls(aux);
|
||||||
__init_security(aux);
|
__init_security(aux);
|
||||||
}
|
}
|
||||||
@ -30,7 +36,7 @@ int __libc_start_main(
|
|||||||
{
|
{
|
||||||
char **envp = argv+argc+1;
|
char **envp = argv+argc+1;
|
||||||
|
|
||||||
__init_libc(envp);
|
__init_libc(envp, argv[0]);
|
||||||
|
|
||||||
libc.ldso_fini = ldso_fini;
|
libc.ldso_fini = ldso_fini;
|
||||||
libc.fini = fini;
|
libc.fini = fini;
|
||||||
|
@ -16,3 +16,7 @@ __asm__(".hidden __libc");
|
|||||||
|
|
||||||
size_t __hwcap;
|
size_t __hwcap;
|
||||||
size_t __sysinfo;
|
size_t __sysinfo;
|
||||||
|
char *__progname=0, *__progname_full=0;
|
||||||
|
|
||||||
|
weak_alias(__progname, program_invocation_short_name);
|
||||||
|
weak_alias(__progname_full, program_invocation_name);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user