update from main archive 960818

This commit is contained in:
Ulrich Drepper 1996-08-19 01:07:44 +00:00
parent e9d258b798
commit 39778c6c9e
13 changed files with 71 additions and 65 deletions

View File

@ -111,11 +111,6 @@ asm ("\nEOF.crtn.init\
\n\
cat >> crti.s-new <<\\EOF.crti.fini");
/* Global variable which says whether we have a statically or dynamically
linked program. If > 0, static, for < 0 dynamic, == 0 means yet to
be determined (see init-first.c). */
int __libc_is_static = 0;
SECTION (".fini")
void
_fini (void)

View File

@ -22,6 +22,11 @@ Cambridge, MA 02139, USA. */
#include <stdlib.h>
#include <errno.h>
extern void _dl_start (void); weak_extern (_dl_start)
extern int __libc_multiple_libcs; /* Defined in init-first.c. */
size_t _dl_global_scope_alloc;
struct link_map *
@ -30,7 +35,9 @@ _dl_open (const char *file, int mode)
struct link_map *new, *l;
ElfW(Addr) init;
struct r_debug *r;
/* To decide whether we are the static libc or not. We must use
this variable since gcc would otherwise optimize the test away. */
void (*dl_start_ptr) (void) = &_dl_start;
/* Load the named object. */
new = _dl_map_object (NULL, file, lt_loaded);
@ -131,5 +138,11 @@ _dl_open (const char *file, int mode)
while (init = _dl_init_next (new))
(*(void (*) (void)) init) ();
if (dl_start_ptr == NULL)
/* We must be the static _dl_open in libc.a because ld.so.1 is not
in scope. A static program that has loaded a dynamic object
now has competition. */
__libc_multiple_libcs = 1;
return new;
}

View File

@ -42,6 +42,15 @@ int _dl_argc;
char **_dl_argv;
const char *_dl_rpath;
/* Set nonzero during loading and initialization of executable and
libraries, cleared before the executable's entry point runs. This
must not be initialized to nonzero, because the unused dynamic
linker loaded in for libc.so's "ld.so.1" dep will provide the
definition seen by libc.so's initializer; that value must be zero,
and will be since that dynamic linker's _dl_start and dl_main will
never be called. */
int _dl_starting_up;
static void dl_main (const ElfW(Phdr) *phdr,
ElfW(Half) phent,
ElfW(Addr) *user_entry);
@ -486,6 +495,9 @@ of this helper program; chances are you did not intend to run this program.\n",
_dl_rtld_map.l_info[DT_INIT] = NULL;
}
/* We finished the intialization and will start up. */
_dl_starting_up = 1;
/* Once we return, _dl_sysdep_start will invoke
the DT_INIT functions and then *USER_ENTRY. */
}

1
err.h Normal file
View File

@ -0,0 +1 @@
#include <misc/err.h>

View File

@ -64,7 +64,8 @@ __pututline_r (const struct utmp *id, struct utmp_data *utmp_data)
match: */
if (id->ut_id[0]
&& (utmp_data->loc_utmp < (off_t) sizeof (struct utmp)
|| strncmp(utmp_data->ubuf.ut_id, id->ut_id, sizeof (id->ut_id)) != 0))
|| strncmp (utmp_data->ubuf.ut_id, id->ut_id,
sizeof (id->ut_id)) != 0))
{
/* We must not overwrite the data in UTMP_DATA since ID may be
aliasing it. */
@ -74,16 +75,8 @@ __pututline_r (const struct utmp *id, struct utmp_data *utmp_data)
*data_tmp = *utmp_data;
utmp_data = data_tmp;
if (getutid_r (id, &dummy, utmp_data) < 0)
{
if (errno != ESRCH)
/* Some error occured. If no entry was found, the position
pointer now is at the end of the file. */
if (getutid_r (id, &dummy, utmp_data) < 0 && errno != ESRCH)
return -1;
/* Set position pointer to position behind the record. */
utmp_data->loc_utmp += sizeof (struct utmp);
}
}
#endif
@ -102,7 +95,8 @@ __pututline_r (const struct utmp *id, struct utmp_data *utmp_data)
if (result >= 0)
/* Position file correctly. */
if (utmp_data->loc_utmp < (off_t) sizeof (struct utmp))
if (utmp_data->loc_utmp < (off_t) sizeof (struct utmp)
|| utmp_data->loc_utmp - sizeof (struct utmp) > st.st_size)
/* Not located at any valid entry. Add at the end. */
{
result = lseek (utmp_data->ut_fd, 0L, SEEK_END);
@ -110,7 +104,7 @@ __pututline_r (const struct utmp *id, struct utmp_data *utmp_data)
/* Where we'll be if the write succeeds. */
utmp_data->loc_utmp = st.st_size + sizeof (struct utmp);
}
else if (utmp_data->loc_utmp <= st.st_size)
else
result =
lseek (utmp_data->ut_fd, utmp_data->loc_utmp - sizeof (struct utmp),
SEEK_SET);

View File

@ -22,10 +22,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
extern void *__curbrk;
extern int __brk (void *addr);
#ifdef PIC
extern int __libc_is_static;
weak_extern (__libc_is_static)
#endif
extern int __libc_multiple_libcs; /* Defined in init-first.c. */
/* Extend the process's data space by INCREMENT.
If INCREMENT is negative, shrink data space by - INCREMENT.
@ -40,9 +37,7 @@ __sbrk (ptrdiff_t increment)
__curbrk from the kernel's brk value. That way two separate
instances of __brk and __sbrk can share the heap, returning
interleaved pieces of it. */
#ifdef PIC
if (__curbrk == NULL || &__libc_is_static == NULL)
#endif
if (__curbrk == NULL || __libc_multiple_libcs)
if (__brk (0) < 0)
return (void *) -1;

View File

@ -163,7 +163,9 @@ _dl_start_user:\n\
call *%eax\n\
# Loop to call _dl_init_next for the next initializer.\n\
jmp 0b\n\
1: # Pass our finalizer function to the user in %edx, as per ELF ABI.\n\
1: # Clear the startup flag.\n\
movl $0, _dl_starting_up@GOT(%ebx)\n\
# Pass our finalizer function to the user in %edx, as per ELF ABI.\n\
movl _dl_fini@GOT(%ebx), %edx\n\
# Jump to the user's entry point.\n\
jmp *%edi\n\

View File

@ -174,7 +174,9 @@ _dl_start_user:
jsr (%a0)
| Loop to call _dl_init_next for the next initializer.
jra 0b
1: | Pass our finalizer function to the user in %a1.
1: | Clear the startup flag.
move.l #0, _dl_starting_up@GOT(%a5)
| Pass our finalizer function to the user in %a1.
move.l _dl_fini@GOT(%a5), %a1
| Initialize %fp with the stack pointer.
move.l %sp, %fp

View File

@ -1,3 +1,7 @@
ifeq ($(subdir), csu)
CFLAGS-init-first.c = -fkeep-inline-functions
endif
ifeq ($(subdir), misc)
sysdep_routines += sysctl clone

View File

@ -2,5 +2,5 @@ ifeq ($(subdir), misc)
sysdep_headers += alpha/ptrace.h alpha/regdef.h
sysdep_routines += ieee_get_fp_control ieee_set_fp_control \
sethae ioperm osf_sigprocmask fstatfs statfs
sethae ioperm osf_sigprocmask fstatfs statfs llseek
endif

View File

@ -52,7 +52,7 @@ I/O address space that's 512MB large!). */
#define vuip volatile unsigned int *
#define JENSEN_IO_BASE (0xfffffc0300000000UL)
#define JENSEN_MEM (0xfffffc0200000000UL) /* sparse!! */
#define JENSEN_SPARSE_MEM (0xfffffc0200000000UL)
/*
* With respect to the I/O architecture, APECS and LCA are identical,
@ -94,7 +94,7 @@ static struct platform {
{"EB64+", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM},
{"EB66", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM},
{"EB66P", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM},
{"Jensen", IOSYS_JENSEN, JENSEN_MEM, JENSEN_MEM},
{"Jensen", IOSYS_JENSEN, 0, JENSEN_SPARSE_MEM},
{"Mikasa", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM},
{"Mustang", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM},
{"Noname", IOSYS_APECS, APECS_DENSE_MEM, APECS_SPARSE_MEM},

View File

@ -29,10 +29,12 @@ extern void __libc_global_ctors (void);
/* The function is called from assembly stubs the compiler can't see. */
static void init (void *) __attribute__ ((unused));
extern int __libc_is_static;
#ifdef PIC
weak_extern (__libc_is_static)
#endif
extern int _dl_starting_up;
weak_extern (_dl_starting_up)
/* Set nonzero if we have to be prepared for more then one libc being
used in the process. Safe assumption if initializer never runs. */
int __libc_multiple_libcs = 1;
static void
init (void *data)
@ -43,41 +45,23 @@ init (void *data)
char **argv = (char **)data + 1;
char **envp = &argv[argc + 1];
/* XXX Another gcc bug. We marked the function as `unused' but it
is still optimized away. */
volatile void *foo __attribute__ ((unused)) = &init;
#ifdef PIC
if (&__libc_is_static != NULL)
#endif
{
#ifdef PIC
__libc_multiple_libcs = &_dl_starting_up && ! _dl_starting_up;
/* We must not call `personality' twice. */
if (__libc_is_static == 0)
#endif
if (!__libc_multiple_libcs)
{
/* The `personality' system call takes one argument that
chooses the "personality", i.e. the set of system calls
and such. We must make this call first thing to disable
emulation of some other system that might have been
enabled by default based on the executable format. */
/* The `personality' system call takes one argument that chooses
the "personality", i.e. the set of system calls and such. We
must make this call first thing to disable emulation of some
other system that might have been enabled by default based on
the executable format. */
__personality (PER_LINUX);
/* Set the FPU control word to the proper default value. */
__setfpucw (__fpu_control);
}
/* We set LIBC_IS_STATIC to a value > 0 for the static library
and < 0 for the shared library. This information might be
useful for the running program but it is mainly necessary for
the above `if' statement. */
#ifdef PIC
__libc_is_static = -1;
#else
__libc_is_static = 1;
#endif
}
__environ = envp;
__libc_init (argc, argv, envp);

View File

@ -21,6 +21,8 @@ Cambridge, MA 02139, USA. */
#define _SYS_IO_H 1
#include <features.h>
__BEGIN_DECLS
/* Get constants from kernel header files. */
#include <asm/io.h>
@ -39,4 +41,6 @@ extern int ioperm __P ((unsigned long int __from, unsigned long int __num,
privileges. */
extern int iopl __P ((int __level));
__END_DECLS
#endif /* _SYS_IO_H */