Skip to content

Commit

Permalink
Update.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Ulrich Drepper committed Jan 11, 2001
1 parent c926001 commit beb5387
Show file tree
Hide file tree
Showing 9 changed files with 143 additions and 3 deletions.
2 changes: 1 addition & 1 deletion CONFORMANCE
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
11 changes: 11 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
6 changes: 5 additions & 1 deletion elf/dl-libc.c
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -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
Expand Down
8 changes: 7 additions & 1 deletion sysdeps/generic/ldsodefs.h
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions sysdeps/unix/sysv/linux/ia64/Dist
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
clone.S
clone2.S
dl-static.c
ioperm.c
net/route.h
sys/procfs.h
Expand Down
6 changes: 6 additions & 0 deletions sysdeps/unix/sysv/linux/ia64/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
3 changes: 3 additions & 0 deletions sysdeps/unix/sysv/linux/ia64/Versions
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ ld {
# global variables needed in the libc.
_dl_pagesize;
}
GLIBC_2.2.1 {
_dl_var_init;
}
}
libc {
GLIBC_2.2 {
Expand Down
77 changes: 77 additions & 0 deletions sysdeps/unix/sysv/linux/ia64/dl-static.c
Original file line number Diff line number Diff line change
@@ -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
32 changes: 32 additions & 0 deletions sysdeps/unix/sysv/linux/ia64/ldsodefs.h
Original file line number Diff line number Diff line change
@@ -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 */

0 comments on commit beb5387

Please sign in to comment.