diff options
author | jdp <jdp@FreeBSD.org> | 2000-01-29 01:27:04 +0000 |
---|---|---|
committer | jdp <jdp@FreeBSD.org> | 2000-01-29 01:27:04 +0000 |
commit | 4bff590782e7100c86fb3cb5c40e46fb5c813b42 (patch) | |
tree | 15bb6f7a1a22644cfbb8a3a3b6db5834e253c62b /libexec/rtld-elf/rtld.h | |
parent | a037c1293d958b92212a5b2d4a23307eea11f46d (diff) | |
download | FreeBSD-src-4bff590782e7100c86fb3cb5c40e46fb5c813b42.zip FreeBSD-src-4bff590782e7100c86fb3cb5c40e46fb5c813b42.tar.gz |
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.
Diffstat (limited to 'libexec/rtld-elf/rtld.h')
-rw-r--r-- | libexec/rtld-elf/rtld.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h index 3a88547..6d1ebbf 100644 --- a/libexec/rtld-elf/rtld.h +++ b/libexec/rtld-elf/rtld.h @@ -142,6 +142,7 @@ typedef struct Struct_Obj_Entry { bool textrel; /* True if there are relocations to text seg */ bool symbolic; /* True if generated with "-Bsymbolic" */ bool traced; /* Already printed in ldd trace output */ + bool jmpslots_done; /* Already have relocated the jump slots */ struct link_map linkmap; /* for GDB */ Objlist dldags; /* Object belongs to these dlopened DAGs (%) */ @@ -176,7 +177,8 @@ void lockdflt_release(void *); void obj_free(Obj_Entry *); Obj_Entry *obj_new(void); int reloc_non_plt(Obj_Entry *, Obj_Entry *); -int reloc_plt(Obj_Entry *, bool); +int reloc_plt(Obj_Entry *); +int reloc_jmpslots(Obj_Entry *); void _rtld_bind_start(void); const Elf_Sym *symlook_obj(const char *, unsigned long, const Obj_Entry *, bool); |