da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1997-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Research
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return a handle for the next layer down,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * i.e., the next layer that has symbols covered
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * by the main prog and dll's loaded so far
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * intentionally light on external lib calls
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * so this routine can be used early in process
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (getenv("DLL_DEBUG") && (vp = (char*)_rld_new_interface(_RLD_FIRST_PATHNAME)))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (strcmp(vp, "MAIN") && (lp = dllopen(vp, flags)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (vp = (char*)_rld_new_interface(_RLD_NEXT_PATHNAME));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (vp = (char*)_rld_new_interface(_RLD_FIRST_PATHNAME))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (lp = dllopen(strcmp(vp, "MAIN") ? vp : (char*)0, flags))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b = e = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (*s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin e = s - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (b && e)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = '_';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = '_';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (b < e)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = *b++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b = "_dummy";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*s++ = *b++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*wr)(2, buf, sfsprintf(buf, sizeof(buf), "dll: next %s\n", vp));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*wr)(2, buf, sfsprintf(buf, sizeof(buf), "dll: skip %s\n", vp));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((_DLL_RLD_SYM_TYPE*)dlsym(lp, _DLL_RLD_SYM_STR) == here)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*wr)(2, buf, sfsprintf(buf, sizeof(buf), "dll: this %s\n", vp));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (vp = (char*)_rld_new_interface(_RLD_NEXT_PATHNAME));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* b;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (map = _DYNAMIC.ld_un.ld_1->ld_loaded; map; map = map->lm_next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s++ == '/')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (b && b[0] == 'l' && b[1] == 'i' && b[2] == 'b' && b[3] == 'c' && b[4] == '.')