#
b5393d9f |
| 15-Oct-2001 |
Doug Rabson <dfr@FreeBSD.org> |
Add ia64 support. Various adjustments were made to existing targets to cope with a few interface changes required by the ia64. In particular, function pointers on ia64 need special treatment in rtld.
|
#
c15e7faa |
| 05-May-2001 |
John Polstra <jdp@FreeBSD.org> |
Performance improvements for the ELF dynamic linker. These particularly help programs which load many shared libraries with a lot of relocations. Large C++ programs such as are found in KDE are a p
Performance improvements for the ELF dynamic linker. These particularly help programs which load many shared libraries with a lot of relocations. Large C++ programs such as are found in KDE are a prime example.
While relocating a shared object, maintain a vector of symbols which have already been looked up, directly indexed by symbol number. Typically, symbols which are referenced by a relocation entry are referenced by many of them. This is the same optimization I made to the a.out dynamic linker in 1995 (rtld.c revision 1.30).
Also, compare the first character of a sought-after symbol with its symbol table entry before calling strcmp().
On a PII/400 these changes reduce the start-up time of a typical KDE program from 833 msec (elapsed) to 370 msec.
MFC after: 5 days
show more ...
|
#
5e6220d9 |
| 02-May-2001 |
David E. O'Brien <obrien@FreeBSD.org> |
* include/elf.h has been repo copied to include/elf-hints.h, and it no longer includes machine/elf.h. * consumers of elf.h now use the minimalist elf header possible.
This change is motivated by B
* include/elf.h has been repo copied to include/elf-hints.h, and it no longer includes machine/elf.h. * consumers of elf.h now use the minimalist elf header possible.
This change is motivated by Binutils 2.11.0 and too much clashing over our base elf headers and the Binutils elf headers.
show more ...
|
#
185db83c |
| 19-Sep-2000 |
John Polstra <jdp@FreeBSD.org> |
Add support for dlsym(RTLD_DEFAULT, ...).
|
#
44a028c3 |
| 26-Jul-2000 |
John Polstra <jdp@FreeBSD.org> |
Revamp the code that calls shared libraries' init and fini functions. Formerly the init functions were called in the opposite of the order in which libraries were loaded, and libraries were loaded ac
Revamp the code that calls shared libraries' init and fini functions. Formerly the init functions were called in the opposite of the order in which libraries were loaded, and libraries were loaded according to a breadth-first traversal of the dependency graph. That ordering came from SVR4.0, and it was easy to implement but not always sensible.
Now we do a depth-first walk over the dependency graph and call the init functions in an order such that each shared object's needed objects are initialized before the shared object itself. At the same time we build a list of finalization (fini) functions in the opposite order, to guarantee correct C++ destructor ordering whenever possible. (It may not be possible if dlopen and dlclose are used in strange ways, but we come as close as one can come.)
The need for this renovation has become apparent as more programs have started using multithreading. The multithreaded C library libc_r requires initialization, whereas the standard libc does not. Since virtually every other object depends on the C library, it is important that it get initialized first.
show more ...
|
#
630df077 |
| 08-Jul-2000 |
John Polstra <jdp@FreeBSD.org> |
Solve the dynamic linker's problems with multithreaded programs once and for all (I hope). Packages such as wine, JDK, and linuxthreads should no longer have any problems with re-entering the dynami
Solve the dynamic linker's problems with multithreaded programs once and for all (I hope). Packages such as wine, JDK, and linuxthreads should no longer have any problems with re-entering the dynamic linker.
This commit replaces the locking used in the dynamic linker with a new spinlock-based reader/writer lock implementation. Brian Fundakowski Feldman <green> argued for this from the very beginning, but it took me a long time to come around to his point of view. Spinlocks are the only kinds of locks that work with all thread packages. But on uniprocessor systems they can be inefficient, because while a contender for the lock is spinning the holder of the lock cannot make any progress toward releasing it. To alleviate this disadvantage I have borrowed a trick from Sleepycat's Berkeley DB implementation. When spinning for a lock, the requester does a nanosleep() call for 1 usec. each time around the loop. This will generally yield the CPU to other threads, allowing the lock holder to finish its business and release the lock. I chose 1 usec. as the minimum sleep which would with reasonable certainty not be rounded down to 0.
The formerly machine-independent file "lockdflt.c" has been moved into the architecture-specific subdirectories by repository copy. It now contains the machine-dependent spinlocking code. For the spinlocks I used the very nifty "simple, non-scalable reader-preference lock" which I found at
<http://www.cs.rochester.edu/u/scott/synchronization/pseudocode/rw.html>
on all CPUs except the 80386 (the specific CPU model, not the architecture). The 80386 CPU doesn't support the necessary "cmpxchg" instruction, so on that CPU a simple exclusive test-and-set lock is used instead. 80386 CPUs are detected at initialization time by trying to execute "cmpxchg" and catching the resulting SIGILL signal.
To reduce contention for the locks, I have revamped a couple of key data structures, permitting all common operations to be done under non-exclusive (reader) locking. The only operations that require exclusive locking now are the rare intrusive operations such as dlopen() and dlclose().
The dllockinit() interface is now deprecated. It still exists, but only as a do-nothing stub. I plan to remove it as soon as is reasonably possible. (From the very beginning it was clearly labeled as experimental and subject to change.) As far as I know, only the linuxthreads port uses dllockinit(). This interface turned out to have several problems. As one example, when the dynamic linker called a client-supplied locking function, that function sometimes needed lazy binding, causing re-entry into the dynamic linker and a big looping mess. And in any case, it turned out to be too burdensome to require threads packages to register themselves with the dynamic linker.
show more ...
|
#
e3975643 |
| 26-May-2000 |
Jake Burkholder <jake@FreeBSD.org> |
Back out the previous change to the queue(3) interface. It was not discussed and should probably not happen.
Requested by: msmith and others
|
#
740a1973 |
| 23-May-2000 |
Jake Burkholder <jake@FreeBSD.org> |
Change the way that the queue(3) structures are declared; don't assume that the type argument to *_HEAD and *_ENTRY is a struct.
Suggested by: phk Reviewed by: phk Approved by: mdodd
|
#
7dbe16fb |
| 29-Jan-2000 |
John Polstra <jdp@FreeBSD.org> |
When a threads package registers locking methods with dllockinit(), figure out which shared object(s) contain the the locking methods and fully bind those objects as if they had been loaded with LD_B
When a threads package registers locking methods with dllockinit(), figure out which shared object(s) contain the the locking methods and fully bind those objects as if they had been loaded with LD_BIND_NOW=1. The goal is to keep the locking methods from requiring any lazy binding. Otherwise infinite recursion occurs in _rtld_bind.
This fixes the infinite recursion problem in the linuxthreads port.
show more ...
|
#
9bfb1dfc |
| 09-Jan-2000 |
John Polstra <jdp@FreeBSD.org> |
Revamp the mechanism for enumerating and calling shared objects' init and fini functions. Now the code is very careful to hold no locks when calling these functions. Thus the dynamic linker cannot
Revamp the mechanism for enumerating and calling shared objects' init and fini functions. Now the code is very careful to hold no locks when calling these functions. Thus the dynamic linker cannot be re-entered with a lock already held.
Remove the tolerance for recursive locking that I added in revision 1.2 of dllockinit.c. Recursive locking shouldn't happen any more.
Mozilla and JDK users: I'd appreciate confirmation that things still work right (or at least the same) with these changes.
show more ...
|
#
d3980376 |
| 27-Dec-1999 |
John Polstra <jdp@FreeBSD.org> |
Add a new function dllockinit() for registering thread locking functions to be used by the dynamic linker. This can be called by threads packages at start-up time. I will add the call to libc_r soo
Add a new function dllockinit() for registering thread locking functions to be used by the dynamic linker. This can be called by threads packages at start-up time. I will add the call to libc_r soon.
Also add a default locking method that is used up until dllockinit() is called. The default method works by blocking SIGVTALRM, SIGPROF, and SIGALRM in critical sections. It is based on the observation that most user-space threads packages implement thread preemption with one of these signals (usually SIGVTALRM).
The dynamic linker has never been reentrant, but it became less reentrant in revision 1.34 of "src/libexec/rtld-elf/rtld.c". Starting with that revision, multiple threads each doing lazy binding could interfere with each other. The usual symptom was that a symbol was falsely reported as undefined at start-up time. It was rare but not unseen. This commit fixes it.
show more ...
|
#
82531605 |
| 05-Sep-1999 |
John Polstra <jdp@FreeBSD.org> |
Make jdk-1.1.8 work again. It turns out that some code inside libjava peeks into the dynamic linker's private Obj_Entry structures. My recent changes introduced some new members near the front of th
Make jdk-1.1.8 work again. It turns out that some code inside libjava peeks into the dynamic linker's private Obj_Entry structures. My recent changes introduced some new members near the front of the structures, causing libjava to get the wrong fields. This commit moves the new members toward the end of the structure so that the layout of the portion that is relevant to JDK remains the same as before.
I will work with the JDK porting team to see if we can come up with a less fragile way for them to do what they need to do. I understand the current approach was necessary in order to work around some limitations of the dynamic linker. Maybe it's not necessary any more.
show more ...
|
#
a607e5d7 |
| 30-Aug-1999 |
John Polstra <jdp@FreeBSD.org> |
Get the actual pathname of the dynamic linker from the executable's PT_INTERP program header entry, to ensure that gdb always finds the right dynamic linker.
Use obj->relocbase to simplify a few cal
Get the actual pathname of the dynamic linker from the executable's PT_INTERP program header entry, to ensure that gdb always finds the right dynamic linker.
Use obj->relocbase to simplify a few calculations where appropriate.
show more ...
|
#
7360ae0f |
| 30-Aug-1999 |
John Polstra <jdp@FreeBSD.org> |
When checking to see if a shared object is already loaded, look for a device/inode match if no pathname match is found.
|
#
926ea445 |
| 30-Aug-1999 |
John Polstra <jdp@FreeBSD.org> |
Revamp the symbol lookup algorithm to cope better with objects loaded separately by dlopen that have global symbols with identical names. Viewing each dlopened object as a DAG which is linked by its
Revamp the symbol lookup algorithm to cope better with objects loaded separately by dlopen that have global symbols with identical names. Viewing each dlopened object as a DAG which is linked by its DT_NEEDED entries in the dynamic table, the search order is as follows:
* If the referencing object was linked with -Bsymbolic, search it internally. * Search all dlopened DAGs containing the referencing object. * Search all objects loaded at program start up. * Search all objects which were dlopened() using the RTLD_GLOBAL flag (which is now supported too).
The search terminates as soon as a strong definition is found. Lacking that, the first weak definition is used.
These rules match those of Solaris, as best I could determine them from its vague manual pages and the results of experiments I performed.
PR: misc/12438
show more ...
|
#
7f3dea24 |
| 28-Aug-1999 |
Peter Wemm <peter@FreeBSD.org> |
$Id$ -> $FreeBSD$
|
#
bfb1ef60 |
| 18-Jul-1999 |
John Polstra <jdp@FreeBSD.org> |
Change many asserts into normal errors. They were all for conditions caused by invalid shared objects rather than by internal errors.
Enable format string mismatch checking for _rtld_error().
|
#
d5b537d0 |
| 09-Apr-1999 |
John Polstra <jdp@FreeBSD.org> |
Eliminate all machine-dependent code from the main source body and the Makefile, and move it down into the architecture-specific subdirectories.
Eliminate an asm() statement for the i386.
Make the
Eliminate all machine-dependent code from the main source body and the Makefile, and move it down into the architecture-specific subdirectories.
Eliminate an asm() statement for the i386.
Make the dynamic linker work if it is built as an executable instead of as a shared library. See i386/Makefile.inc to find out how to do it. Note, this change is not enabled and it might never be enabled. But it might be useful in the future. Building the dynamic linker as an executable should make it start up faster, because it won't have any relocations. But in practice I suspect the difference is negligible.
show more ...
|
#
13575fc4 |
| 04-Sep-1998 |
Doug Rabson <dfr@FreeBSD.org> |
Add alpha support.
Submitted by: John Birrell <jb@cimlogic.com.au> (with extra hacks by me) Obtained from: Probably NetBSD
|
#
63fac2b9 |
| 02-Sep-1998 |
John Polstra <jdp@FreeBSD.org> |
Suppress duplicate entries in ldd output.
|
#
1eab1be0 |
| 21-Aug-1998 |
John Birrell <jb@FreeBSD.org> |
Update this header to use the revamped elf headers which select Elf32 or Elf64 based on the inclusion of the machine dependent header.
I've left the addition of the extra fields to handle the reloca
Update this header to use the revamped elf headers which select Elf32 or Elf64 based on the inclusion of the machine dependent header.
I've left the addition of the extra fields to handle the relocation structures with addend for a separate commit after jdp has had a chance to review what I've done. The current change is needed to compile csu/alpha/crt1.c
show more ...
|
#
2001f720 |
| 30-Apr-1998 |
Doug Rabson <dfr@FreeBSD.org> |
Add GDB support. The method and some of the code came from NetBSD's elf runtime linker.
|
#
3124c3e0 |
| 07-Mar-1998 |
John Polstra <jdp@FreeBSD.org> |
Import the ELF dynamic linker. This is the ElfKit version with quite a few enhancements and bug fixes. There are still some known deficiencies, but it should be adequate to get us started with ELF.
Import the ELF dynamic linker. This is the ElfKit version with quite a few enhancements and bug fixes. There are still some known deficiencies, but it should be adequate to get us started with ELF.
Submitted by: John Polstra <jdp@polstra.com>
show more ...
|