98c080d502548e68bb9815459ea56e6ae282c430Rod Evans/*
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * CDDL HEADER START
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans *
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * The contents of this file are subject to the terms of the
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * Common Development and Distribution License (the "License").
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * You may not use this file except in compliance with the License.
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans *
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * or http://www.opensolaris.org/os/licensing.
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * See the License for the specific language governing permissions
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * and limitations under the License.
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans *
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * When distributing Covered Code, include this CDDL HEADER in each
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * If applicable, add the following below this CDDL HEADER, with the
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * fields enclosed by brackets "[]" replaced with your own identifying
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * information: Portions Copyright [yyyy] [name of copyright owner]
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans *
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * CDDL HEADER END
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans */
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans/*
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * Use is subject to license terms.
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans */
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans#include "msg.h"
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans#include "_debug.h"
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans#include "libld.h"
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evansvoid
98c080d502548e68bb9815459ea56e6ae282c430Rod EvansDbg_dl_iphdr_enter(Rt_map *clmp, u_longlong_t cnt_map, u_longlong_t cnt_unmap)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans{
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Lm_list *lml = LIST(clmp);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (DBG_NOTCLASS(DBG_C_DL))
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans return;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Dbg_util_nl(lml, DBG_NL_STD);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_IPHDR_ENTER), NAME(clmp));
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_IPHDR_MAPCNT), cnt_map, cnt_unmap);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans}
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evansvoid
98c080d502548e68bb9815459ea56e6ae282c430Rod EvansDbg_dl_iphdr_callback(Lm_list *lml, struct dl_phdr_info *info)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans{
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (DBG_NOTCLASS(DBG_C_DL))
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans return;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_IPHDR_CALLBACK));
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_IPHDR_NAME), info->dlpi_name);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_IPHDR_ADDR), EC_ADDR(info->dlpi_addr));
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_IPHDR_PHDR),
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans EC_ADDR(CAST_PTRINT(Addr, info->dlpi_phdr)),
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans EC_WORD(info->dlpi_phnum));
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans}
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evansvoid
98c080d502548e68bb9815459ea56e6ae282c430Rod EvansDbg_dl_iphdr_mapchange(Lm_list *lml, u_longlong_t cnt_map,
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans u_longlong_t cnt_unmap)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans{
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (DBG_NOTCLASS(DBG_C_DL))
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans return;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_IPHDR_MAPCNG));
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_IPHDR_MAPCNT), cnt_map, cnt_unmap);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans}
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evansvoid
98c080d502548e68bb9815459ea56e6ae282c430Rod EvansDbg_dl_iphdr_unmap_ret(Lm_list *lml)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans{
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (DBG_NOTCLASS(DBG_C_DL))
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans return;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_IPHDR_UNMAP));
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans}
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evansvoid
98c080d502548e68bb9815459ea56e6ae282c430Rod EvansDbg_dl_dlopen(Rt_map *clmp, const char *name, int *in_nfavl, int mode)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans{
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Conv_dl_mode_buf_t dl_mode_buf;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Lm_list *lml = LIST(clmp);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans const char *retry;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (DBG_NOTCLASS(DBG_C_FILES | DBG_C_DL))
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans return;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans /*
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * The core functionality of dlopen() can be called twice. The first
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * attempt can be affected by path names that exist in the "not-found"
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * AVL tree. Should a "not-found" path name be found, a second attempt
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * is made to locate the required file (in_nfavl is NULL). This fall-
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * back provides for file system changes while a process executes.
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans */
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (in_nfavl)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans retry = MSG_ORIG(MSG_STR_EMPTY);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans else
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans retry = MSG_INTL(MSG_STR_RETRY);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Dbg_util_nl(lml, DBG_NL_STD);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_DLOPEN), name, NAME(clmp), retry,
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans conv_dl_mode(mode, 0, &dl_mode_buf));
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans}
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evansvoid
98c080d502548e68bb9815459ea56e6ae282c430Rod EvansDbg_dl_dlclose(Rt_map *clmp, const char *name, int flag)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans{
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans const char *str;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Lm_list *lml = LIST(clmp);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (DBG_NOTCLASS(DBG_C_FILES | DBG_C_DL))
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans return;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (flag == DBG_DLCLOSE_IGNORE)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans str = MSG_INTL(MSG_STR_IGNORE);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans else
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans str = MSG_ORIG(MSG_STR_EMPTY);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Dbg_util_nl(lml, DBG_NL_STD);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_DLCLOSE), name, NAME(clmp), str);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans}
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evansvoid
98c080d502548e68bb9815459ea56e6ae282c430Rod EvansDbg_dl_dldump(Rt_map *clmp, const char *ipath, const char *opath, int flags)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans{
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Conv_dl_flag_buf_t dl_flag_buf;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Lm_list *lml = LIST(clmp);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (DBG_NOTCLASS(DBG_C_FILES | DBG_C_DL))
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans return;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Dbg_util_nl(lml, DBG_NL_STD);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_DLDUMP), ipath, NAME(clmp),
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans opath ? opath : MSG_INTL(MSG_STR_NULL),
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans conv_dl_flag(flags, 0, &dl_flag_buf));
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans}
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evansvoid
98c080d502548e68bb9815459ea56e6ae282c430Rod EvansDbg_dl_dlerror(Rt_map *clmp, const char *str)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans{
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Lm_list *lml = LIST(clmp);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (DBG_NOTCLASS(DBG_C_DL))
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans return;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Dbg_util_nl(lml, DBG_NL_STD);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_DLERROR), NAME(clmp),
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans str ? str : MSG_INTL(MSG_STR_NULL));
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans}
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evansvoid
98c080d502548e68bb9815459ea56e6ae282c430Rod EvansDbg_dl_dladdr(Rt_map *clmp, void *addr)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans{
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Lm_list *lml = LIST(clmp);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (DBG_NOTCLASS(DBG_C_DL))
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans return;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Dbg_util_nl(lml, DBG_NL_STD);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_DLADDR), NAME(clmp), EC_NATPTR(addr));
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans}
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evansvoid
98c080d502548e68bb9815459ea56e6ae282c430Rod EvansDbg_dl_dlsym(Rt_map *clmp, const char *sym, int *in_nfavl, const char *next,
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans int type)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans{
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans const char *str, *retry, *from = NAME(clmp);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Lm_list *lml = LIST(clmp);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans static const Msg dlsym_msg[DBG_DLSYM_NUM] = {
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans MSG_STR_EMPTY, /* MSG_ORIG(MSG_STR_EMPTY) */
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans MSG_DLSYM_NEXT, /* MSG_ORIG(MSG_DLSYM_NEXT) */
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans MSG_DLSYM_DEFAULT, /* MSG_ORIG(MSG_DLSYM_DEFAULT) */
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans MSG_DLSYM_SELF, /* MSG_ORIG(MSG_DLSYM_SELF) */
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans MSG_DLSYM_PROBE, /* MSG_ORIG(MSG_DLSYM_PROBE) */
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans MSG_DLSYM_SINGLETON /* MSG_ORIG(MSG_DLSYM_SINGLETON) */
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans };
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans#if DBG_DLSYM_NUM != (DBG_DLSYM_SINGLETON + 1)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans#error DBG_DLSYM_NUM has grown
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans#endif
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (DBG_NOTCLASS(DBG_C_SYMBOLS | DBG_C_DL))
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans return;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans /*
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * The core functionality of dlsym() can be called twice. The first
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * attempt can be affected by path names that exist in the "not-found"
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * AVL tree. Should a "not-found" path name be found, a second attempt
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * is made to locate the required file (in_nfavl is NULL). This fall-
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans * back provides for file system changes while a process executes.
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans */
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (in_nfavl)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans retry = MSG_ORIG(MSG_STR_EMPTY);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans else
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans retry = MSG_INTL(MSG_STR_RETRY);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (type >= DBG_DLSYM_NUM)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans type = 0;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans str = MSG_ORIG(dlsym_msg[type]);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Dbg_util_nl(lml, DBG_NL_STD);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (next == 0)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DLSYM_1), Dbg_demangle_name(sym),
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans from, retry, str);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans else
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DLSYM_2), Dbg_demangle_name(sym),
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans from, next, retry, str);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans}
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evansvoid
98c080d502548e68bb9815459ea56e6ae282c430Rod EvansDbg_dl_dlinfo(Rt_map *clmp, const char *name, int request, void *addr)
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans{
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Lm_list *lml = LIST(clmp);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans if (DBG_NOTCLASS(DBG_C_DL))
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans return;
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans Dbg_util_nl(lml, DBG_NL_STD);
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans dbg_print(lml, MSG_INTL(MSG_DL_DLINFO), NAME(clmp), name,
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans conv_dl_info(request), EC_NATPTR(addr));
98c080d502548e68bb9815459ea56e6ae282c430Rod Evans}