diff options
author | jdp <jdp@FreeBSD.org> | 1999-08-30 01:48:19 +0000 |
---|---|---|
committer | jdp <jdp@FreeBSD.org> | 1999-08-30 01:48:19 +0000 |
commit | 4382ccec34f7f0bb2721459e301575176a175688 (patch) | |
tree | b8c873578b2f44d81183ecf2c7d5dd097bff5f6b /libexec/rtld-elf/alpha/reloc.c | |
parent | d8c85ab826fb402b3bb08f91f622e4e355f63b21 (diff) | |
download | FreeBSD-src-4382ccec34f7f0bb2721459e301575176a175688.zip FreeBSD-src-4382ccec34f7f0bb2721459e301575176a175688.tar.gz |
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
Diffstat (limited to 'libexec/rtld-elf/alpha/reloc.c')
-rw-r--r-- | libexec/rtld-elf/alpha/reloc.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/libexec/rtld-elf/alpha/reloc.c b/libexec/rtld-elf/alpha/reloc.c index 03d8c17..1b55d06 100644 --- a/libexec/rtld-elf/alpha/reloc.c +++ b/libexec/rtld-elf/alpha/reloc.c @@ -60,8 +60,7 @@ extern Elf_Dyn _DYNAMIC; /* Relocate a non-PLT object with addend. */ static int -reloc_non_plt_obj(Obj_Entry *obj_rtld, const Obj_Entry *obj, - const Elf_Rela *rela) +reloc_non_plt_obj(Obj_Entry *obj_rtld, Obj_Entry *obj, const Elf_Rela *rela) { Elf_Addr *where = (Elf_Addr *) (obj->relocbase + rela->r_offset); |