Sun Jun 4 22:14:11 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>

* hurd/Makefile (sig): Added thread-self.
	* hurd/hurd.h: Declare hurd_thread_self.
	* hurd/thread-self.c: New file.

Thu Jun  1 12:17:52 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* elf/rtld.c: Initialize RTLD_MAP.l_type.
	* elf/dl-reloc.c (_dl_relocate_object): Clear LAZY if relocating
 	the dynamic linker itself.
This commit is contained in:
Roland McGrath 1995-06-05 03:04:45 +00:00
parent a1a9d21596
commit ded291197c
6 changed files with 59 additions and 1 deletions

View File

@ -1,3 +1,15 @@
Sun Jun 4 22:14:11 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* hurd/Makefile (sig): Added thread-self.
* hurd/hurd.h: Declare hurd_thread_self.
* hurd/thread-self.c: New file.
Thu Jun 1 12:17:52 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* elf/rtld.c: Initialize RTLD_MAP.l_type.
* elf/dl-reloc.c (_dl_relocate_object): Clear LAZY if relocating
the dynamic linker itself.
Tue May 30 15:52:32 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* mach/Makefile (server-interfaces): Removed notify and

View File

@ -76,6 +76,14 @@ _dl_relocate_object (struct link_map *l, int lazy)
else
scope = _dl_loaded;
if (l->l_type == lt_interpreter)
/* We cannot be lazy when relocating the dynamic linker itself. It
was previously relocated eagerly (allowing us to be running now),
and needs always to be fully relocated so it can run without the
aid of run-time fixups (because it's the one to do them), so we
must always re-relocate its PLT eagerly. */
lazy = 0;
ELF_DYNAMIC_RELOCATE (l, lazy, resolve);
/* Restore list frobnication done above for DT_SYMBOLIC. */

View File

@ -70,6 +70,13 @@ _dl_start (void *arg)
/* Relocate ourselves so we can do normal function calls and
data access using the global offset table. */
/* We must initialize `l_type' to make sure it is not `lt_interpreter'.
That is the type to describe us, but not during bootstrapping--it
indicates to elf_machine_rel{,a} that we were already relocated during
bootstrapping, so it must anti-perform each bootstrapping relocation
before applying the final relocation when ld.so is linked in as
normal a shared library. */
rtld_map.l_type = lt_library;
ELF_DYNAMIC_RELOCATE (&rtld_map, 0, NULL);

View File

@ -52,7 +52,8 @@ routines = hurdstartup hurdinit \
ports-get ports-set hurdports hurdmsg \
$(sig) $(dtable) hurdinline port-cleanup
sig = hurdsig hurdfault faultexc siginfo hurd-raise preempt-sig \
trampoline longjmp-ts catch-exc exc2signal hurdkill sigunwind
trampoline longjmp-ts catch-exc exc2signal hurdkill sigunwind \
thread-self
dtable = dtable port2fd new-fd alloc-fd intern-fd \
getdport openport \
fd-close fd-read fd-write hurdioctl ctty-input ctty-output

View File

@ -281,6 +281,10 @@ extern pid_t __task2pid (task_t task), task2pid (task_t task);
extern task_t __pid2task (pid_t pid), pid2task (pid_t pid);
/* Return the current thread's thread port. This is a cheap operation (no
system call), but it relies on Hurd signal state being set up. */
extern thread_t hurd_thread_self (void);
/* Return the io server port for file descriptor FD.
This adds a Mach user reference to the returned port.

26
hurd/thread-self.c Normal file
View File

@ -0,0 +1,26 @@
/* Cheap function to get current thread from sigstate without a syscall.
Copyright (C) 1995 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <hurd/signal.h>
thread_t
hurd_thread_self (void)
{
return _hurd_self_sigstate ()->thread;
}