فهرست منبع

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.
Rich Felker 12 سال پیش
والد
کامیت
b4ea63856a
3فایلهای تغییر یافته به همراه18 افزوده شده و 2 حذف شده
  1. 6 0
      include/errno.h
  2. 8 2
      src/env/__libc_start_main.c
  3. 4 0
      src/internal/libc.c

+ 6 - 0
include/errno.h

@@ -5,6 +5,8 @@
 extern "C" {
 #endif
 
+#include <features.h>
+
 #include <bits/errno.h>
 
 #ifdef __GNUC__
@@ -13,6 +15,10 @@ __attribute__((const))
 int *__errno_location(void);
 #define errno (*__errno_location())
 
+#ifdef _GNU_SOURCE
+extern char *program_invocation_short_name, *program_invocation_name;
+#endif
+
 #ifdef __cplusplus
 }
 #endif

+ 8 - 2
src/env/__libc_start_main.c

@@ -8,8 +8,9 @@ void __init_ldso_ctors(void);
 #define AUX_CNT 38
 
 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 };
 	__environ = envp;
@@ -19,6 +20,11 @@ void __init_libc(char **envp)
 	__hwcap = aux[AT_HWCAP];
 	__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_security(aux);
 }
@@ -30,7 +36,7 @@ int __libc_start_main(
 {
 	char **envp = argv+argc+1;
 
-	__init_libc(envp);
+	__init_libc(envp, argv[0]);
 
 	libc.ldso_fini = ldso_fini;
 	libc.fini = fini;

+ 4 - 0
src/internal/libc.c

@@ -16,3 +16,7 @@ __asm__(".hidden __libc");
 
 size_t __hwcap;
 size_t __sysinfo;
+char *__progname=0, *__progname_full=0;
+
+weak_alias(__progname, program_invocation_short_name);
+weak_alias(__progname_full, program_invocation_name);