/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <procfs.h>
#include <libelf.h>
#include <link.h>
#include <stdarg.h>
#include "rdb.h"
static char *
{
if (len < 17)
return (NULL);
if (ident == LM_ID_BASE)
if (ident == LM_ID_LDSO)
return (buf);
}
{
if (soname == PS_OBJ_LDSO)
else if (soname == PS_OBJ_EXEC)
else {
break;
}
return (mip);
}
{
/*
* To early to have the full Link Map info available
* so we use the initial info obtained from procfs
*/
return (NULL);
}
return (mip);
return (NULL);
}
{
(void) printf("link-maps not yet available\n");
return (RET_FAILED);
}
(void) printf("Link Maps\n");
(void) printf("---------\n");
(void) printf("link-map: id: %s name: ",
if (mip->mi_refname)
mip->mi_refname);
else
(void) printf(" base: 0x%08lx padd_base: 0x%08lx\n",
(void) printf(" data_base: 0x%08llx\n",
(unsigned long long)lp->rl_data_base);
(void) printf(" end: 0x%08lx padd_end: 0x%08lx\n",
flagstr[0] = '\0';
}
(void) printf(" dynamic: 0x%08lx flags: "
}
return (RET_OK);
}
{
void *ptr;
perr("stat map");
perr("dm: reading map");
(void) puts("\nMappings");
(void) puts("--------");
(void) puts("addr size prot ident name");
else
(void) puts("addr size prot ident name");
mapptr++) {
(void) printf("%#18llx %#08llx %#04x",
else
(void) printf("0x%08llx 0x%06llx 0x%02x",
if (mip->mi_refname) {
(void) printf(" 0x%02lx %s(%s)",
mip->mi_refname);
} else
}
(void) putchar('\n');
}
(void) putchar('\n');
return (RET_OK);
}
{
int cnt;
void *ptr;
perr("stat map");
perr("dm: reading map");
mapptr++) {
if (mapptr->pr_mapname[0]) {
mapptr->pr_mapname);
}
break;
}
}
if (filefd == -1) {
return (RET_FAILED);
}
return (RET_FAILED);
}
(void) printf("non-elf file\n");
return (RET_FAILED);
}
return (RET_FAILED);
}
#if defined(_ELF64)
#else
#endif
return (RET_FAILED);
}
}
}
mp->mi_pltbase = 0;
mp->mi_pltsize = 0;
mp->mi_pltentsz = 0;
return (RET_FAILED);
}
case SHT_DYNSYM:
break;
case SHT_SUNW_LDYNSYM:
break;
case SHT_SYMTAB:
break;
case PLTSECTT:
}
break;
default:
/* nothing */
break;
}
}
return (RET_OK);
}
static int
{
"failed\n");
return (0);
}
return (0);
}
if (lop->rl_refnameaddr) {
MAXPATHLEN) == RET_FAILED) {
return (0);
}
} else
/*
* Relocatable objects are processed to create in-memory shared objects,
* and as such have no file associated with the allocated memory shared
* object.
*/
}
return (1);
}
return (1);
}
void
{
if (prev) {
if (prev->mi_refname)
}
}
if (prev) {
if (prev->mi_refname)
}
}
{
return (RET_OK);
}
{
(void) printf("rdb: error setting object padding\n");
return (RET_FAILED);
}
return (RET_OK);
}