Page MenuHomeFreeBSD

D37220.id112662.diff
No OneTemporary

D37220.id112662.diff

diff --git a/lib/csu/aarch64/Makefile b/lib/csu/aarch64/Makefile
--- a/lib/csu/aarch64/Makefile
+++ b/lib/csu/aarch64/Makefile
@@ -3,7 +3,6 @@
.PATH: ${.CURDIR:H}/common
CFLAGS+= -I${.CURDIR}
-CFLAGS+= -DCRT_IRELOC_RELA
CRT1OBJS+= crt1_s.o
diff --git a/lib/csu/aarch64/crt1_c.c b/lib/csu/aarch64/crt1_c.c
--- a/lib/csu/aarch64/crt1_c.c
+++ b/lib/csu/aarch64/crt1_c.c
@@ -32,42 +32,19 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <stdlib.h>
-
#include "libc_private.h"
-#include "ignore_init.c"
-
-#ifdef GCRT
-extern void _mcleanup(void);
-extern void monstartup(void *, void *);
-extern int eprol;
-extern int etext;
-#endif
-
-extern long * _end;
+#include "csu_common.h"
-void __start(int, char **, char **, void (*)(void));
+void __start(int, char **, char **, void (*)(void)) __dead2;
/* The entry function. */
void
__start(int argc, char *argv[], char *env[], void (*cleanup)(void))
{
-
- handle_argv(argc, argv, env);
-
- if (&_DYNAMIC != NULL)
- atexit(cleanup);
- else {
- process_irelocs();
- _init_tls();
- }
-
#ifdef GCRT
- atexit(_mcleanup);
- monstartup(&eprol, &etext);
+ __libc_start1_gcrt(argc, argv, env, cleanup, main, &eprol, &etext);
__asm__("eprol:");
+#else
+ __libc_start1(argc, argv, env, cleanup, main);
#endif
-
- handle_static_init(argc, argv, env);
- exit(main(argc, argv, env));
}
diff --git a/lib/csu/amd64/Makefile b/lib/csu/amd64/Makefile
--- a/lib/csu/amd64/Makefile
+++ b/lib/csu/amd64/Makefile
@@ -3,6 +3,6 @@
.PATH: ${.CURDIR:H}/common
CFLAGS+= -I${.CURDIR}
-CFLAGS+= -fno-omit-frame-pointer -DCRT_IRELOC_RELA
+CFLAGS+= -fno-omit-frame-pointer
.include <bsd.lib.mk>
diff --git a/lib/csu/amd64/crt1_c.c b/lib/csu/amd64/crt1_c.c
--- a/lib/csu/amd64/crt1_c.c
+++ b/lib/csu/amd64/crt1_c.c
@@ -29,19 +29,10 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <stdlib.h>
-
#include "libc_private.h"
-#include "ignore_init.c"
-
-#ifdef GCRT
-extern void _mcleanup(void);
-extern void monstartup(void *, void *);
-extern int eprol;
-extern int etext;
-#endif
+#include "csu_common.h"
-void _start(char **, void (*)(void));
+void _start(char **, void (*)(void)) __dead2;
/* The entry function. */
void
@@ -54,21 +45,10 @@
argc = *(long *)(void *)ap;
argv = ap + 1;
env = ap + 2 + argc;
- handle_argv(argc, argv, env);
-
- if (&_DYNAMIC != NULL) {
- atexit(cleanup);
- } else {
- process_irelocs();
- _init_tls();
- }
-
#ifdef GCRT
- atexit(_mcleanup);
- monstartup(&eprol, &etext);
+ __libc_start1_gcrt(argc, argv, env, cleanup, main, &eprol, &etext);
__asm__("eprol:");
+#else
+ __libc_start1(argc, argv, env, cleanup, main);
#endif
-
- handle_static_init(argc, argv, env);
- exit(main(argc, argv, env));
}
diff --git a/lib/csu/arm/Makefile b/lib/csu/arm/Makefile
--- a/lib/csu/arm/Makefile
+++ b/lib/csu/arm/Makefile
@@ -2,8 +2,6 @@
.PATH: ${.CURDIR:H}/common
-CFLAGS+= -DCRT_IRELOC_SUPPRESS
-
CRT1OBJS+= crt1_s.o
.include <bsd.lib.mk>
diff --git a/lib/csu/arm/crt1_c.c b/lib/csu/arm/crt1_c.c
--- a/lib/csu/arm/crt1_c.c
+++ b/lib/csu/arm/crt1_c.c
@@ -46,50 +46,33 @@
#include <sys/param.h>
#include <sys/elf_common.h>
-#include <stdlib.h>
#include "libc_private.h"
-#include "ignore_init.c"
+#include "csu_common.h"
struct Struct_Obj_Entry;
struct ps_strings;
-extern void _start(int, char **, char **, const struct Struct_Obj_Entry *,
- void (*)(void), struct ps_strings *);
-
-#ifdef GCRT
-extern void _mcleanup(void);
-extern void monstartup(void *, void *);
-extern int eprol;
-extern int etext;
-#endif
+void _start(int, char **, char **, const struct Struct_Obj_Entry *,
+ void (*)(void), struct ps_strings *) __dead2;
struct ps_strings *__ps_strings;
void __start(int, char **, char **, struct ps_strings *,
- const struct Struct_Obj_Entry *, void (*)(void));
+ const struct Struct_Obj_Entry *, void (*)(void)) __dead2;
-/* ARGSUSED */
void
__start(int argc, char **argv, char **env, struct ps_strings *ps_strings,
const struct Struct_Obj_Entry *obj __unused, void (*cleanup)(void))
{
-
- handle_argv(argc, argv, env);
-
if (ps_strings != (struct ps_strings *)0)
__ps_strings = ps_strings;
- if (&_DYNAMIC != NULL)
- atexit(cleanup);
- else
- _init_tls();
#ifdef GCRT
- atexit(_mcleanup);
- monstartup(&eprol, &etext);
+ __libc_start1_gcrt(argc, argv, env, cleanup, main, &eprol, &etext);
+#else
+ __libc_start1(argc, argv, env, cleanup, main);
#endif
- handle_static_init(argc, argv, env);
- exit(main(argc, argv, env));
}
#ifdef GCRT
diff --git a/lib/csu/common/csu_common.h b/lib/csu/common/csu_common.h
new file mode 100644
--- /dev/null
+++ b/lib/csu/common/csu_common.h
@@ -0,0 +1,41 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright 1996-1998 John D. Polstra.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This file includes both definitions and declarations, it can be
+ * included only into one compilation unit for csu objects.
+ */
+
+char **environ;
+const char *__progname = "";
+
+#ifdef GCRT
+extern int eprol;
+extern int etext;
+#endif
+
+extern int main(int, char **, char **);
diff --git a/lib/csu/i386/Makefile b/lib/csu/i386/Makefile
--- a/lib/csu/i386/Makefile
+++ b/lib/csu/i386/Makefile
@@ -3,7 +3,6 @@
.PATH: ${.CURDIR:H}/common
CFLAGS+= -I${.CURDIR}
-CFLAGS+= -DCRT_IRELOC_REL
CRT1OBJS+= crt1_s.o
diff --git a/lib/csu/i386/crt1_c.c b/lib/csu/i386/crt1_c.c
--- a/lib/csu/i386/crt1_c.c
+++ b/lib/csu/i386/crt1_c.c
@@ -29,20 +29,10 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <stdlib.h>
-
#include "libc_private.h"
-#include "ignore_init.c"
-
-extern void _start(char *, ...);
-
-#ifdef GCRT
-extern void _mcleanup(void);
-extern void monstartup(void *, void *);
-extern int eprol;
-extern int etext;
-#endif
+#include "csu_common.h"
+void _start(char *, ...);
void _start1(void (*)(void), int, char *[]) __dead2;
/* The entry function, C part. */
@@ -52,22 +42,12 @@
char **env;
env = argv + argc + 1;
- handle_argv(argc, argv, env);
- if (&_DYNAMIC != NULL) {
- atexit(cleanup);
- } else {
- process_irelocs();
- _init_tls();
- }
-
#ifdef GCRT
- atexit(_mcleanup);
- monstartup(&eprol, &etext);
+ __libc_start1_gcrt(argc, argv, env, cleanup, main, &eprol, &etext);
__asm__("eprol:");
+#else
+ __libc_start1(argc, argv, env, cleanup, main);
#endif
-
- handle_static_init(argc, argv, env);
- exit(main(argc, argv, env));
}
__asm(".hidden _start1");
diff --git a/lib/csu/powerpc/Makefile b/lib/csu/powerpc/Makefile
--- a/lib/csu/powerpc/Makefile
+++ b/lib/csu/powerpc/Makefile
@@ -3,6 +3,5 @@
.PATH: ${.CURDIR:H}/common
OBJS+= crtsavres.o
-CFLAGS+= -DCRT_IRELOC_SUPPRESS
.include <bsd.lib.mk>
diff --git a/lib/csu/powerpc/crt1_c.c b/lib/csu/powerpc/crt1_c.c
--- a/lib/csu/powerpc/crt1_c.c
+++ b/lib/csu/powerpc/crt1_c.c
@@ -47,22 +47,16 @@
#include <stdlib.h>
#include "libc_private.h"
-#include "ignore_init.c"
+#include "csu_common.h"
struct Struct_Obj_Entry;
struct ps_strings;
-#ifdef GCRT
-extern void _mcleanup(void);
-extern void monstartup(void *, void *);
-extern int eprol;
-extern int etext;
-#endif
-
struct ps_strings *__ps_strings;
+extern int eprol, etext;
void _start(int, char **, char **, const struct Struct_Obj_Entry *,
- void (*)(void), struct ps_strings *);
+ void (*)(void), struct ps_strings *) __dead2;
/* The entry function. */
/*
@@ -75,25 +69,14 @@
const struct Struct_Obj_Entry *obj __unused, void (*cleanup)(void),
struct ps_strings *ps_strings)
{
-
-
- handle_argv(argc, argv, env);
-
if (ps_strings != (struct ps_strings *)0)
__ps_strings = ps_strings;
- if (&_DYNAMIC != NULL)
- atexit(cleanup);
- else
- _init_tls();
-
#ifdef GCRT
- atexit(_mcleanup);
- monstartup(&eprol, &etext);
+ __libc_start1_gcrt(argc, argv, env, cleanup, main, &eprol, &etext);
+#else
+ __libc_start1(argc, argv, env, cleanup, main);
#endif
-
- handle_static_init(argc, argv, env);
- exit(main(argc, argv, env));
}
#ifdef GCRT
diff --git a/lib/csu/powerpc64/Makefile b/lib/csu/powerpc64/Makefile
--- a/lib/csu/powerpc64/Makefile
+++ b/lib/csu/powerpc64/Makefile
@@ -4,7 +4,7 @@
OBJS+= crtsavres.o
CFLAGS+= -I${.CURDIR} \
- -mlongcall -DCRT_IRELOC_RELA
+ -mlongcall
CLEANFILES+= crtsavres.S
diff --git a/lib/csu/powerpc64/crt1_c.c b/lib/csu/powerpc64/crt1_c.c
--- a/lib/csu/powerpc64/crt1_c.c
+++ b/lib/csu/powerpc64/crt1_c.c
@@ -44,87 +44,38 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <stdlib.h>
#include <stdint.h>
#include <sys/elf.h>
-static uint32_t cpu_features;
-static uint32_t cpu_features2;
-
#include "libc_private.h"
-#include "ignore_init.c"
+#include "csu_common.h"
struct Struct_Obj_Entry;
struct ps_strings;
-extern void _start(int, char **, char **, const struct Struct_Obj_Entry *,
- void (*)(void), struct ps_strings *);
-
-#ifdef GCRT
-extern void _mcleanup(void);
-extern void monstartup(void *, void *);
-extern int eprol;
-extern int etext;
-#endif
+void _start(int, char **, char **, const struct Struct_Obj_Entry *,
+ void (*)(void), struct ps_strings *) __dead2;
struct ps_strings *__ps_strings;
-static void
-init_cpu_features(char **env)
-{
- const Elf_Auxinfo *aux;
-
- /* Find the auxiliary vector on the stack. */
- while (*env++ != 0) /* Skip over environment, and NULL terminator */
- ;
- aux = (const Elf_Auxinfo *)env;
-
- /* Digest the auxiliary vector. */
- for (; aux->a_type != AT_NULL; aux++) {
- switch (aux->a_type) {
- case AT_HWCAP:
- cpu_features = (uint32_t)aux->a_un.a_val;
- break;
- case AT_HWCAP2:
- cpu_features2 = (uint32_t)aux->a_un.a_val;
- break;
- }
- }
-}
-
-
/* The entry function. */
/*
* First 5 arguments are specified by the PowerPC SVR4 ABI.
* The last argument, ps_strings, is a BSD extension.
*/
-/* ARGSUSED */
void
_start(int argc, char **argv, char **env,
const struct Struct_Obj_Entry *obj __unused, void (*cleanup)(void),
struct ps_strings *ps_strings)
{
-
- handle_argv(argc, argv, env);
-
if (ps_strings != (struct ps_strings *)0)
__ps_strings = ps_strings;
- if (&_DYNAMIC != NULL)
- atexit(cleanup);
- else {
- init_cpu_features(env);
- process_irelocs();
- _init_tls();
- }
-
#ifdef GCRT
- atexit(_mcleanup);
- monstartup(&eprol, &etext);
+ __libc_start1_gcrt(argc, argv, env, cleanup, main, &eprol, &etext);
+#else
+ __libc_start1(argc, argv, env, cleanup, main);
#endif
-
- handle_static_init(argc, argv, env);
- exit(main(argc, argv, env));
}
#ifdef GCRT
diff --git a/lib/csu/riscv/Makefile b/lib/csu/riscv/Makefile
--- a/lib/csu/riscv/Makefile
+++ b/lib/csu/riscv/Makefile
@@ -2,8 +2,6 @@
.PATH: ${.CURDIR:H}/common
-CFLAGS+= -DCRT_IRELOC_SUPPRESS
-
CRT1OBJS+= crt1_s.o
.include <bsd.lib.mk>
diff --git a/lib/csu/riscv/crt1_c.c b/lib/csu/riscv/crt1_c.c
--- a/lib/csu/riscv/crt1_c.c
+++ b/lib/csu/riscv/crt1_c.c
@@ -36,37 +36,18 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <stdlib.h>
-
#include "libc_private.h"
-#include "ignore_init.c"
-
-#ifdef GCRT
-extern void _mcleanup(void);
-extern void monstartup(void *, void *);
-extern int eprol;
-extern int etext;
-#endif
+#include "csu_common.h"
-void __start(int argc, char **argv, char **env, void (*cleanup)(void));
+void __start(int argc, char **argv, char **env, void (*cleanup)(void)) __dead2;
void
__start(int argc, char **argv, char **env, void (*cleanup)(void))
{
-
- handle_argv(argc, argv, env);
-
- if (&_DYNAMIC != NULL)
- atexit(cleanup);
- else
- _init_tls();
-
#ifdef GCRT
- atexit(_mcleanup);
- monstartup(&eprol, &etext);
+ __libc_start1_gcrt(argc, argv, env, cleanup, main, &eprol, &etext);
__asm__("eprol:");
+#else
+ __libc_start1(argc, argv, env, cleanup, main);
#endif
-
- handle_static_init(argc, argv, env);
- exit(main(argc, argv, env));
}
diff --git a/lib/libc/Makefile b/lib/libc/Makefile
--- a/lib/libc/Makefile
+++ b/lib/libc/Makefile
@@ -93,6 +93,7 @@
NOASM=
.include "${LIBC_SRCTOP}/${LIBC_ARCH}/Makefile.inc"
+.include "${LIBC_SRCTOP}/csu/Makefile.inc"
.include "${LIBC_SRCTOP}/db/Makefile.inc"
.include "${LIBC_SRCTOP}/compat-43/Makefile.inc"
.include "${LIBC_SRCTOP}/gdtoa/Makefile.inc"
diff --git a/lib/libc/csu/Makefile.inc b/lib/libc/csu/Makefile.inc
new file mode 100644
--- /dev/null
+++ b/lib/libc/csu/Makefile.inc
@@ -0,0 +1,10 @@
+#
+
+.PATH: ${LIBC_SRCTOP}/csu
+.include "${LIBC_SRCTOP}/csu/${LIBC_ARCH}/Makefile.inc"
+
+SRCS+= \
+ ignore_init.c
+
+CFLAGS+= -I${LIBC_SRCTOP}/csu/${LIBC_ARCH}
+SYM_MAPS+=${LIBC_SRCTOP}/csu/Symbol.map
diff --git a/lib/libc/csu/Symbol.map b/lib/libc/csu/Symbol.map
new file mode 100644
--- /dev/null
+++ b/lib/libc/csu/Symbol.map
@@ -0,0 +1,4 @@
+FBSD_1.7 {
+ __libc_start1;
+ __libc_start1_gcrt;
+};
diff --git a/lib/libc/csu/aarch64/Makefile.inc b/lib/libc/csu/aarch64/Makefile.inc
new file mode 100644
--- /dev/null
+++ b/lib/libc/csu/aarch64/Makefile.inc
@@ -0,0 +1,4 @@
+#
+
+CFLAGS+= -DCRT_IRELOC_RELA \
+ -DINIT_IRELOCS=""
diff --git a/lib/csu/aarch64/reloc.c b/lib/libc/csu/aarch64/reloc.c
rename from lib/csu/aarch64/reloc.c
rename to lib/libc/csu/aarch64/reloc.c
diff --git a/lib/libc/csu/amd64/Makefile.inc b/lib/libc/csu/amd64/Makefile.inc
new file mode 100644
--- /dev/null
+++ b/lib/libc/csu/amd64/Makefile.inc
@@ -0,0 +1,4 @@
+#
+
+CFLAGS+= -DCRT_IRELOC_RELA \
+ -DINIT_IRELOCS="init_cpu_features()"
diff --git a/lib/csu/amd64/reloc.c b/lib/libc/csu/amd64/reloc.c
rename from lib/csu/amd64/reloc.c
rename to lib/libc/csu/amd64/reloc.c
--- a/lib/csu/amd64/reloc.c
+++ b/lib/libc/csu/amd64/reloc.c
@@ -29,13 +29,13 @@
#include <machine/specialreg.h>
#include <machine/cpufunc.h>
+static uint32_t cpu_feature, cpu_feature2;
+static uint32_t cpu_stdext_feature, cpu_stdext_feature2;
+
static void
-crt1_handle_rela(const Elf_Rela *r)
+init_cpu_features(void)
{
- Elf_Addr *ptr, *where, target;
u_int p[4];
- uint32_t cpu_feature, cpu_feature2;
- uint32_t cpu_stdext_feature, cpu_stdext_feature2;
do_cpuid(1, p);
cpu_feature = p[3];
@@ -49,6 +49,12 @@
cpu_stdext_feature = 0;
cpu_stdext_feature2 = 0;
}
+}
+
+static void
+crt1_handle_rela(const Elf_Rela *r)
+{
+ Elf_Addr *ptr, *where, target;
switch (ELF_R_TYPE(r->r_info)) {
case R_X86_64_IRELATIVE:
diff --git a/lib/libc/csu/arm/Makefile.inc b/lib/libc/csu/arm/Makefile.inc
new file mode 100644
--- /dev/null
+++ b/lib/libc/csu/arm/Makefile.inc
@@ -0,0 +1,4 @@
+#
+
+CFLAGS+= -DCRT_IRELOC_SUPPRESS \
+ -DINIT_IRELOCS=""
diff --git a/lib/libc/csu/i386/Makefile.inc b/lib/libc/csu/i386/Makefile.inc
new file mode 100644
--- /dev/null
+++ b/lib/libc/csu/i386/Makefile.inc
@@ -0,0 +1,4 @@
+#
+
+CFLAGS+= -DCRT_IRELOC_REL \
+ -DINIT_IRELOCS="init_cpu_features()"
diff --git a/lib/csu/i386/reloc.c b/lib/libc/csu/i386/reloc.c
rename from lib/csu/i386/reloc.c
rename to lib/libc/csu/i386/reloc.c
--- a/lib/csu/i386/reloc.c
+++ b/lib/libc/csu/i386/reloc.c
@@ -29,13 +29,13 @@
#include <machine/specialreg.h>
#include <machine/cpufunc.h>
+static uint32_t cpu_feature, cpu_feature2;
+static uint32_t cpu_stdext_feature, cpu_stdext_feature2;
+
static void
-crt1_handle_rel(const Elf_Rel *r)
+init_cpu_features(void)
{
- Elf_Addr *where, target;
u_int cpuid_supported, p[4];
- uint32_t cpu_feature, cpu_feature2;
- uint32_t cpu_stdext_feature, cpu_stdext_feature2;
__asm __volatile(
" pushfl\n"
@@ -72,6 +72,12 @@
cpu_stdext_feature = 0;
cpu_stdext_feature2 = 0;
}
+}
+
+static void
+crt1_handle_rel(const Elf_Rel *r)
+{
+ Elf_Addr *where, target;
switch (ELF_R_TYPE(r->r_info)) {
case R_386_IRELATIVE:
diff --git a/lib/csu/common/ignore_init.c b/lib/libc/csu/ignore_init.c
rename from lib/csu/common/ignore_init.c
rename to lib/libc/csu/ignore_init.c
--- a/lib/csu/common/ignore_init.c
+++ b/lib/libc/csu/ignore_init.c
@@ -31,8 +31,8 @@
#include <sys/param.h>
#include <sys/elf.h>
#include <sys/elf_common.h>
-
-extern int main(int, char **, char **);
+#include <stdlib.h>
+#include "libc_private.h"
extern void (*__preinit_array_start[])(int, char **, char **) __hidden;
extern void (*__preinit_array_end[])(int, char **, char **) __hidden;
@@ -79,9 +79,6 @@
#error "Define platform reloc type"
#endif
-char **environ;
-const char *__progname = "";
-
static void
finalizer(void)
{
@@ -97,7 +94,7 @@
_fini();
}
-static inline void
+static void
handle_static_init(int argc, char **argv, char **env)
{
void (*fn)(int, char **, char **);
@@ -123,7 +120,7 @@
}
}
-static inline void
+static void
handle_argv(int argc, char *argv[], char **env)
{
const char *s;
@@ -138,3 +135,51 @@
}
}
}
+
+void
+__libc_start1(int argc, char *argv[], char *env[], void (*cleanup)(void),
+ int (*mainX)(int, char *[], char *[]))
+{
+ handle_argv(argc, argv, env);
+
+ if (&_DYNAMIC != NULL) {
+ atexit(cleanup);
+ } else {
+#ifndef CRT_IRELOC_SUPPRESS
+ INIT_IRELOCS;
+ process_irelocs();
+#endif
+ _init_tls();
+ }
+
+ handle_static_init(argc, argv, env);
+ exit(mainX(argc, argv, env));
+}
+
+/* XXXKIB _mcleanup and monstartup defs */
+extern void _mcleanup(void);
+extern void monstartup(void *, void *);
+
+void
+__libc_start1_gcrt(int argc, char *argv[], char *env[],
+ void (*cleanup)(void), int (*mainX)(int, char *[], char *[]),
+ int *eprolp, int *etextp)
+{
+ handle_argv(argc, argv, env);
+
+ if (&_DYNAMIC != NULL) {
+ atexit(cleanup);
+ } else {
+#ifndef CRT_IRELOC_SUPPRESS
+ INIT_IRELOCS;
+ process_irelocs();
+#endif
+ _init_tls();
+ }
+
+ atexit(_mcleanup);
+ monstartup(eprolp, etextp);
+
+ handle_static_init(argc, argv, env);
+ exit(mainX(argc, argv, env));
+}
diff --git a/lib/libc/csu/powerpc/Makefile.inc b/lib/libc/csu/powerpc/Makefile.inc
new file mode 100644
--- /dev/null
+++ b/lib/libc/csu/powerpc/Makefile.inc
@@ -0,0 +1,4 @@
+#
+
+CFLAGS+= -DCRT_IRELOC_SUPPRESS \
+ -DINIT_IRELOCS=""
diff --git a/lib/libc/csu/powerpc64/Makefile.inc b/lib/libc/csu/powerpc64/Makefile.inc
new file mode 100644
--- /dev/null
+++ b/lib/libc/csu/powerpc64/Makefile.inc
@@ -0,0 +1,4 @@
+#
+
+CFLAGS+= -DCRT_IRELOC_RELA \
+ -DINIT_IRELOCS="init_cpu_features(env)"
diff --git a/lib/csu/powerpc64/reloc.c b/lib/libc/csu/powerpc64/reloc.c
rename from lib/csu/powerpc64/reloc.c
rename to lib/libc/csu/powerpc64/reloc.c
--- a/lib/csu/powerpc64/reloc.c
+++ b/lib/libc/csu/powerpc64/reloc.c
@@ -23,6 +23,32 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+static uint32_t cpu_features;
+static uint32_t cpu_features2;
+
+static void
+init_cpu_features(char **env)
+{
+ const Elf_Auxinfo *aux;
+
+ /* Find the auxiliary vector on the stack. */
+ while (*env++ != 0) /* Skip over environment, and NULL terminator */
+ ;
+ aux = (const Elf_Auxinfo *)env;
+
+ /* Digest the auxiliary vector. */
+ for (; aux->a_type != AT_NULL; aux++) {
+ switch (aux->a_type) {
+ case AT_HWCAP:
+ cpu_features = (uint32_t)aux->a_un.a_val;
+ break;
+ case AT_HWCAP2:
+ cpu_features2 = (uint32_t)aux->a_un.a_val;
+ break;
+ }
+ }
+}
+
static void
crt1_handle_rela(const Elf_Rela *r)
{
diff --git a/lib/libc/csu/riscv/Makefile.inc b/lib/libc/csu/riscv/Makefile.inc
new file mode 100644
--- /dev/null
+++ b/lib/libc/csu/riscv/Makefile.inc
@@ -0,0 +1,4 @@
+#
+
+CFLAGS+= -DCRT_IRELOC_SUPPRESS \
+ -DINIT_IRELOCS=""
diff --git a/lib/libc/gen/auxv.c b/lib/libc/gen/auxv.c
--- a/lib/libc/gen/auxv.c
+++ b/lib/libc/gen/auxv.c
@@ -39,7 +39,6 @@
#include "un-namespace.h"
#include "libc_private.h"
-extern char **environ;
extern int _DYNAMIC;
#pragma weak _DYNAMIC
diff --git a/lib/libc/gen/exec.c b/lib/libc/gen/exec.c
--- a/lib/libc/gen/exec.c
+++ b/lib/libc/gen/exec.c
@@ -47,8 +47,6 @@
#include "un-namespace.h"
#include "libc_private.h"
-extern char **environ;
-
static const char execvPe_err_preamble[] = "execvP: ";
static const char execvPe_err_trailer[] = ": path too long\n";
diff --git a/lib/libc/gen/popen.c b/lib/libc/gen/popen.c
--- a/lib/libc/gen/popen.c
+++ b/lib/libc/gen/popen.c
@@ -53,8 +53,6 @@
#include "un-namespace.h"
#include "libc_private.h"
-extern char **environ;
-
struct pid {
SLIST_ENTRY(pid) next;
FILE *fp;
diff --git a/lib/libc/gen/posix_spawn.c b/lib/libc/gen/posix_spawn.c
--- a/lib/libc/gen/posix_spawn.c
+++ b/lib/libc/gen/posix_spawn.c
@@ -45,8 +45,6 @@
#include "un-namespace.h"
#include "libc_private.h"
-extern char **environ;
-
struct __posix_spawnattr {
short sa_flags;
pid_t sa_pgroup;
diff --git a/lib/libc/gen/tls.c b/lib/libc/gen/tls.c
--- a/lib/libc/gen/tls.c
+++ b/lib/libc/gen/tls.c
@@ -401,8 +401,6 @@
#endif /* PIC */
-extern char **environ;
-
void
_init_tls(void)
{
diff --git a/lib/libc/include/libc_private.h b/lib/libc/include/libc_private.h
--- a/lib/libc/include/libc_private.h
+++ b/lib/libc/include/libc_private.h
@@ -39,6 +39,8 @@
#include <sys/_types.h>
#include <sys/_pthreadtypes.h>
+extern char **environ;
+
/*
* This global flag is non-zero when a process has created one
* or more threads. It is used to avoid calling locking functions
@@ -249,6 +251,12 @@
int _yp_check(char **);
#endif
+void __libc_start1(int, char *[], char *[],
+ void (*)(void), int (*)(int, char *[], char *[])) __dead2;
+void __libc_start1_gcrt(int, char *[], char *[],
+ void (*)(void), int (*)(int, char *[], char *[]),
+ int *, int *) __dead2;
+
/*
* Initialise TLS for static programs
*/
diff --git a/lib/libc/stdlib/getenv.c b/lib/libc/stdlib/getenv.c
--- a/lib/libc/stdlib/getenv.c
+++ b/lib/libc/stdlib/getenv.c
@@ -39,7 +39,7 @@
#include <string.h>
#include <unistd.h>
#include "un-namespace.h"
-
+#include "libc_private.h"
static const char CorruptEnvFindMsg[] = "environment corrupt; unable to find ";
static const char CorruptEnvValueMsg[] =
@@ -56,7 +56,6 @@
* intEnviron: Internally-built environ. Exposed via environ during
* (re)builds of the environment.
*/
-extern char **environ;
static char **origEnviron;
static char **intEnviron = NULL;
static int environSize = 0;

File Metadata

Mime Type
text/plain
Expires
Sun, Oct 12, 5:35 PM (3 h, 22 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
23620851
Default Alt Text
D37220.id112662.diff (22 KB)

Event Timeline