From d3c677c7e0039cb80844be0eb5c0a6d065a84b62 Mon Sep 17 00:00:00 2001 From: John Polstra Date: Sun, 12 Jan 1997 00:09:11 +0000 Subject: [PATCH] Add support for the LD_BIND_NOW environment variable. If it is set to a nonempty string, then function calls are relocated at program start-up rather than lazily. This variable is standard on Sun and SVR4 systems. The dlopen() function now supports both lazy and immediate binding, as determined by its "mode" argument, which can be either 1 (RTLD_LAZY) or 2 (RTLD_NOW). I will add defines of these symbols to as soon as I've done a little more checking to make sure they won't cause collisions or bootstrapping problems that would break "make world". --- gnu/usr.bin/ld/i386/md.c | 20 +++++++++++++++++++- gnu/usr.bin/ld/i386/md.h | 3 ++- libexec/rtld-aout/i386/md.c | 20 +++++++++++++++++++- libexec/rtld-aout/i386/md.h | 3 ++- 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/gnu/usr.bin/ld/i386/md.c b/gnu/usr.bin/ld/i386/md.c index 546bd8e2e97..3c9610b127a 100644 --- a/gnu/usr.bin/ld/i386/md.c +++ b/gnu/usr.bin/ld/i386/md.c @@ -27,10 +27,11 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: md.c,v 1.12 1995/03/04 17:46:20 nate Exp $ + * $Id: md.c,v 1.13 1996/10/01 01:27:56 peter Exp $ */ #include +#include #include #include #include @@ -171,6 +172,23 @@ u_long addr; sp->reloc_index = 0; } +/* + * Bind a jmpslot to its target address. TARGET is where the jmpslot + * should jump to, and WHERE is a pointer to the jmpslot's address field. + * This is called by the dynamic linker when LD_BIND_NOW is set in the + * environment. + */ +void +md_bind_jmpslot(target, where) +u_long target; +caddr_t where; +{ + jmpslot_t *sp = + (jmpslot_t *) (where - offsetof(jmpslot_t, addr[0])); + + md_fix_jmpslot(sp, (long) sp, target); +} + /* * Update the relocation record for a RRS jmpslot. */ diff --git a/gnu/usr.bin/ld/i386/md.h b/gnu/usr.bin/ld/i386/md.h index f7ad9d406df..cdf3191f76d 100644 --- a/gnu/usr.bin/ld/i386/md.h +++ b/gnu/usr.bin/ld/i386/md.h @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: md.h,v 1.12 1995/03/04 17:46:21 nate Exp $ + * $Id: md.h,v 1.13 1996/10/01 01:27:58 peter Exp $ */ #ifndef __MD_H__ @@ -232,6 +232,7 @@ long md_get_addend __P((struct relocation_info *, unsigned char *)); void md_relocate __P((struct relocation_info *, long, unsigned char *, int)); void md_make_jmpslot __P((jmpslot_t *, long, long)); void md_fix_jmpslot __P((jmpslot_t *, long, u_long)); +void md_bind_jmpslot __P((u_long, caddr_t)); int md_make_reloc __P((struct relocation_info *, struct relocation_info *, int)); void md_make_jmpreloc __P((struct relocation_info *, struct relocation_info *, int)); void md_make_gotreloc __P((struct relocation_info *, struct relocation_info *, int)); diff --git a/libexec/rtld-aout/i386/md.c b/libexec/rtld-aout/i386/md.c index 546bd8e2e97..3c9610b127a 100644 --- a/libexec/rtld-aout/i386/md.c +++ b/libexec/rtld-aout/i386/md.c @@ -27,10 +27,11 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: md.c,v 1.12 1995/03/04 17:46:20 nate Exp $ + * $Id: md.c,v 1.13 1996/10/01 01:27:56 peter Exp $ */ #include +#include #include #include #include @@ -171,6 +172,23 @@ u_long addr; sp->reloc_index = 0; } +/* + * Bind a jmpslot to its target address. TARGET is where the jmpslot + * should jump to, and WHERE is a pointer to the jmpslot's address field. + * This is called by the dynamic linker when LD_BIND_NOW is set in the + * environment. + */ +void +md_bind_jmpslot(target, where) +u_long target; +caddr_t where; +{ + jmpslot_t *sp = + (jmpslot_t *) (where - offsetof(jmpslot_t, addr[0])); + + md_fix_jmpslot(sp, (long) sp, target); +} + /* * Update the relocation record for a RRS jmpslot. */ diff --git a/libexec/rtld-aout/i386/md.h b/libexec/rtld-aout/i386/md.h index f7ad9d406df..cdf3191f76d 100644 --- a/libexec/rtld-aout/i386/md.h +++ b/libexec/rtld-aout/i386/md.h @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: md.h,v 1.12 1995/03/04 17:46:21 nate Exp $ + * $Id: md.h,v 1.13 1996/10/01 01:27:58 peter Exp $ */ #ifndef __MD_H__ @@ -232,6 +232,7 @@ long md_get_addend __P((struct relocation_info *, unsigned char *)); void md_relocate __P((struct relocation_info *, long, unsigned char *, int)); void md_make_jmpslot __P((jmpslot_t *, long, long)); void md_fix_jmpslot __P((jmpslot_t *, long, u_long)); +void md_bind_jmpslot __P((u_long, caddr_t)); int md_make_reloc __P((struct relocation_info *, struct relocation_info *, int)); void md_make_jmpreloc __P((struct relocation_info *, struct relocation_info *, int)); void md_make_gotreloc __P((struct relocation_info *, struct relocation_info *, int));