diff options
Diffstat (limited to 'lib/csu/i386/crt0.c')
-rw-r--r-- | lib/csu/i386/crt0.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/lib/csu/i386/crt0.c b/lib/csu/i386/crt0.c index b3884e4..80759cf 100644 --- a/lib/csu/i386/crt0.c +++ b/lib/csu/i386/crt0.c @@ -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: crt0.c,v 1.30 1997/08/02 04:56:33 jdp Exp $ + * $Id: crt0.c,v 1.31 1997/11/22 03:34:45 brian Exp $ */ #include <sys/param.h> @@ -85,7 +85,7 @@ static int _strncmp(); extern struct _dynamic _DYNAMIC; static struct ld_entry *ld_entry; -static void __do_dynamic_link (); +static void __do_dynamic_link(char **argv); #endif /* DYNAMIC */ int _callmain(); @@ -174,7 +174,7 @@ start() /* sometimes GCC is too smart/stupid for its own good */ x = (caddr_t)&_DYNAMIC; if (x) - __do_dynamic_link(); + __do_dynamic_link(argv); #endif /* DYNAMIC */ asm("eprol:"); @@ -190,7 +190,8 @@ asm ("__callmain:"); /* Defined for the benefit of debuggers */ #ifdef DYNAMIC static void -__do_dynamic_link () +__do_dynamic_link(argv) + char **argv; { struct crt_ldso crt; struct exec hdr; @@ -253,14 +254,20 @@ __do_dynamic_link () crt.crt_prog = __progname; crt.crt_ldso = ldso; crt.crt_ldentry = NULL; + crt.crt_argv = argv; entry = (int (*)())(crt.crt_ba + sizeof hdr); - ldso_version = (*entry)(CRT_VERSION_BSD_4, &crt); + ldso_version = (*entry)(CRT_VERSION_BSD_5, &crt); ld_entry = crt.crt_ldentry; if (ldso_version == -1 && ld_entry == NULL) { - /* if version 4 not recognised, try version 3 */ - ldso_version = (*entry)(CRT_VERSION_BSD_3, &crt); - ld_entry = _DYNAMIC.d_entry; + /* If version 5 not recognised, try version 4 */ + ldso_version = (*entry)(CRT_VERSION_BSD_4, &crt); + ld_entry = crt.crt_ldentry; + if (ldso_version == -1 && ld_entry == NULL) { + /* if version 4 not recognised, try version 3 */ + ldso_version = (*entry)(CRT_VERSION_BSD_3, &crt); + ld_entry = _DYNAMIC.d_entry; + } } if (ldso_version == -1) { _PUTMSG("ld.so failed"); @@ -334,6 +341,16 @@ dlerror() return (ld_entry->dlerror)(); } +int +dladdr(addr, dlip) + const void *addr; + Dl_info *dlip; +{ + if (ld_entry == NULL || ldso_version < LDSO_VERSION_HAS_DLADDR) + return 0; + return (ld_entry->dladdr)(addr, dlip); +} + /* * Support routines @@ -419,12 +436,19 @@ const char *name; return NULL; } - const char * dlerror() { return "Service unavailable"; } + +int +dladdr(addr, dlip) + const void *addr; + Dl_info *dlip; +{ + return 0; +} #endif /* DYNAMIC */ |