2001-01-10  H.J. Lu  <hjl@gnu.org>

	* elf/dl-libc.c (do_dlopen): Call DL_STATIC_INIT for static binaries.
	* sysdeps/unix/sysv/linux/ia64/Makefile (sysdep-dl-routines): Add
	dl-static.
	* sysdeps/unix/sysv/linux/ia64/Versions (ld): Add _dl_var_init.
	* sysdeps/generic/ldsodefs.h (DL_STATIC_INIT): Defined if not defined.
	* sysdeps/unix/sysv/linux/ia64/ldsodefs.h: New file.
	* sysdeps/unix/sysv/linux/ia64/dl-static.c: New file.
	* sysdeps/unix/sysv/linux/ia64/Dist: Add dl-static.c.
This commit is contained in:
Ulrich Drepper 2001-01-11 17:50:24 +00:00
parent c926001f2a
commit beb5387cf6
9 changed files with 143 additions and 3 deletions

View File

@ -167,7 +167,7 @@ as of 2001-01-10, and relates to i686-linux; older GCC may lead to
more problems in the headers.
Note that the _t suffix is reserved by POSIX, but not by pure ISO C.
Update.Also, the Single Unix Specification generally requires more types to
Also, the Single Unix Specification generally requires more types to
be included in headers (if _XOPEN_SOURCE is defined appropriately)
than ISO C permits.

View File

@ -1,3 +1,14 @@
2001-01-10 H.J. Lu <hjl@gnu.org>
* elf/dl-libc.c (do_dlopen): Call DL_STATIC_INIT for static binaries.
* sysdeps/unix/sysv/linux/ia64/Makefile (sysdep-dl-routines): Add
dl-static.
* sysdeps/unix/sysv/linux/ia64/Versions (ld): Add _dl_var_init.
* sysdeps/generic/ldsodefs.h (DL_STATIC_INIT): Defined if not defined.
* sysdeps/unix/sysv/linux/ia64/ldsodefs.h: New file.
* sysdeps/unix/sysv/linux/ia64/dl-static.c: New file.
* sysdeps/unix/sysv/linux/ia64/Dist: Add dl-static.c.
2001-01-11 Ulrich Drepper <drepper@redhat.com>
* libio/stdio.h: Remove definition of off_t.

View File

@ -1,5 +1,5 @@
/* Handle loading and unloading shared objects for internal libc purposes.
Copyright (C) 1999, 2000 Free Software Foundation, Inc.
Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Zack Weinberg <zack@rabi.columbia.edu>, 1999.
@ -76,6 +76,10 @@ do_dlopen (void *ptr)
struct do_dlopen_args *args = (struct do_dlopen_args *) ptr;
/* Open and relocate the shared object. */
args->map = _dl_open (args->name, RTLD_LAZY, NULL);
#ifndef SHARED
DL_STATIC_INIT (args->map);
#endif
}
static void

View File

@ -1,5 +1,5 @@
/* Run-time dynamic linker data structures for loaded ELF shared objects.
Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc.
Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -81,6 +81,12 @@ typedef ElfW(Addr) lookup_t;
(map)->l_map_end - (map)->l_map_start)
#endif
/* By default we do not need special support to initialize DSOs loaded
by statically linked binaries. */
#ifndef DL_STATIC_INIT
# define DL_STATIC_INIT(map)
#endif
/* For the version handling we need an array with only names and their
hash values. */
struct r_found_version

View File

@ -1,5 +1,6 @@
clone.S
clone2.S
dl-static.c
ioperm.c
net/route.h
sys/procfs.h

View File

@ -6,3 +6,9 @@ ifeq ($(subdir),misc)
sysdep_headers += sys/io.h
sysdep_routines += ioperm clone2
endif
ifeq ($(subdir),elf)
sysdep-dl-routines += dl-static
sysdep_routines += $(sysdep-dl-routines)
sysdep-rtld-routines += $(sysdep-dl-routines)
endif

View File

@ -3,6 +3,9 @@ ld {
# global variables needed in the libc.
_dl_pagesize;
}
GLIBC_2.2.1 {
_dl_var_init;
}
}
libc {
GLIBC_2.2 {

View File

@ -0,0 +1,77 @@
/* Variable initialization. IA-64 version.
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <ldsodefs.h>
extern int _dl_clktck;
#ifdef SHARED
void
_dl_var_init (void *array[])
{
/* It has to match "variables" below. */
enum
{
DL_PAGESIZE = 0,
DL_CLKTCK
};
_dl_pagesize = *((size_t *) array[DL_PAGESIZE]);
_dl_clktck = *((int *) array[DL_CLKTCK]);
}
#else
#include <bits/libc-lock.h>
__libc_lock_define_initialized_recursive (, _dl_static_lock)
static void *variables[] =
{
&_dl_pagesize,
&_dl_clktck
};
void
_dl_static_init (struct link_map *map)
{
const ElfW(Sym) *ref;
lookup_t loadbase;
void (*f) (void *[]);
static int done = 0;
__libc_lock_lock (_dl_static_lock);
if (done)
{
__libc_lock_unlock (_dl_static_lock);
return;
}
done = 1;
loadbase = _dl_lookup_symbol ("_dl_var_init", map, &ref,
map->l_local_scope, 0, 1);
f = (void (*) (void *[])) DL_SYMBOL_ADDRESS (loadbase, ref);
f (variables);
__libc_lock_unlock (_dl_static_lock);
}
#endif

View File

@ -0,0 +1,32 @@
/* Run-time dynamic linker data structures for loaded ELF shared objects. IA64.
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _LDSODEFS_H
/* Get the real definitions. */
#include_next <ldsodefs.h>
/* Now define our stuff. */
/* We need special support to initialize DSO loaded for statically linked
binaries. */
extern void _dl_static_init (struct link_map *map);
#define DL_STATIC_INIT(map) _dl_static_init (map)
#endif /* ldsodefs.h */