diff options
author | dzwdz | 2022-10-19 14:23:14 +0200 |
---|---|---|
committer | dzwdz | 2022-10-19 14:23:14 +0200 |
commit | 3655115e5a3c50fc06afd801100a9d75d813fd2b (patch) | |
tree | c9d4f39608d19d0a4b0b886d70d9b86463a59d60 /src/user/lib/_start2.c | |
parent | 753d43d349bfde6b83cff650c9354c4a0442a3ae (diff) |
user/libc: BSD err.h, getprogname()
Diffstat (limited to 'src/user/lib/_start2.c')
-rw-r--r-- | src/user/lib/_start2.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/user/lib/_start2.c b/src/user/lib/_start2.c index 6d1431f..0582dde 100644 --- a/src/user/lib/_start2.c +++ b/src/user/lib/_start2.c @@ -1,13 +1,30 @@ #include <camellia/syscalls.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <unistd.h> #include <user/lib/elfload.h> int main(int argc, char **argv, char **envp); +__attribute__((visibility("hidden"))) +extern char _image_base[]; + +const char *shortname(const char *path) { + if (!path) return "unknown program"; + const char *slash = strrchr(path, '/'); + if (slash) return slash + 1; + return path; +} + _Noreturn void _start2(struct execdata *ed) { + const char *progname; elf_selfreloc(); __setinitialcwd(ed->cwd); + + progname = shortname(ed->argv[0]); + setprogname(progname); + _klogf("_start2 %s 0x%x", progname, _image_base); + exit(main(ed->argc, ed->argv, ed->envp)); } |