1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright (c) 1998-2000 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27#ifndef	_STATIC_PROF_H
28#define	_STATIC_PROF_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32#ifdef	__cplusplus
33extern "C" {
34#endif
35
36/*
37 * include headers
38 */
39
40#include <stdio.h>
41#include <string.h>
42#include <stdlib.h>
43#include <unistd.h>
44#include <fcntl.h>
45#include <libelf.h>
46#include <link.h>
47#include <sys/elf_SPARC.h>
48#include <sys/utsname.h>
49#include <errno.h>
50
51/*
52 * Declaration of global variables
53 */
54
55#define	DEFBKTS		24997	/* 3571 nice big prime number */
56#define	MASK		(~(unsigned long)0<<28)
57
58/*
59 * bucket struct of hash table
60 */
61typedef struct binding_bucket
62{
63	char			*sym;
64	char			*ref_lib;
65	char			*def_lib;
66	char			*obj;
67	char			*section;
68	char			*sttype;
69	char			*stbind;
70} binding_bucket;
71
72static binding_bucket	bkts[DEFBKTS];
73
74/*
75 * data structure for linked list of DT_NEEDED entries
76 */
77typedef struct dt_list_tag
78{
79	char			*libname;
80#if	defined(_LP64)
81	Elf64_Sword		d_tag;
82#else
83	Elf32_Sword		d_tag;
84#endif
85	struct dt_list_tag	*next;
86} dt_list;
87
88static dt_list		*dt_needed = NULL; /* ptr to link list of dtneeded */
89
90/*
91 * struct for the binary object under test
92 */
93typedef struct obj_com
94{
95	char		**filenames;	/* name of application file */
96	char		*filename;
97	int		numfiles;	/* number of applications to check */
98	/* ---Current application ELF file information--- */
99	char		*ename;	/* name of current ELF file */
100	int		fd;	/* file descriptor for current file */
101	Elf		*elf;	/* elf descriptor for current file */
102#if	defined(_LP64)
103	Elf64_Ehdr	*ehdr;	/* 64 bit elf header for current file */
104	Elf64_Phdr	*phdr;	/* 64 bit prog header for current file */
105	Elf64_Dyn	*dynsect;	/* pointer to 64 bit dynamic section */
106#else
107	Elf32_Ehdr    	*ehdr;	/* 32 bit elf header for current file */
108	Elf32_Phdr    	*phdr;	/* 32 bit prog header for current file */
109	Elf32_Dyn	*dynsect;	/* ptr to 64 bit dynamic section */
110#endif
111	Elf_Data	*ddata;	/* ptr to dstring table data descriptor */
112	char		*dynnames; /* pointer to dynamic string table */
113	/* ---ELF file symbol table information--- */
114	/* dynamic symbol table */
115#if	defined(_LP64)
116	Elf64_Sym	*dsym_tab;
117#else
118	Elf32_Sym	*dsym_tab;
119#endif
120	Elf_Data	*dsym_data;
121	int		dsym_num;
122	char		*dsym_names;
123	/* regular symbol table */
124#if	defined(_LP64)
125	Elf64_Sym	*sym_tab;
126#else
127	Elf32_Sym	*sym_tab;
128#endif
129	Elf_Data	*sym_data;
130	int		sym_num;
131	char		*sym_names;
132} obj_com;
133
134/*
135 * struct of the linked list of object files
136 */
137typedef struct obj_list_tag
138{
139	obj_com		*obj;
140	struct obj_list_tag	*next;
141} obj_list;
142
143static int	oflag = 0;		/* flag for redirecting output */
144static int	pflag = 0;		/* flag for profiling to stdout */
145static int	sflag = 1;		/* flag for silent mode */
146static int	aflag = 1;		/* flag for read input as archive */
147extern int	errno;			/* file opening error return code */
148static FILE	*OUTPUT_FD = stdout;	/* output fd: default as stdout */
149static char	*outputfile;		/* full pathname of output file */
150
151#define	SUCCEED		0
152#define	FAIL		1
153
154#define	TRUE		1
155#define	FALSE		0
156
157#ifdef	__cplusplus
158}
159#endif
160
161#endif	/* _STATIC_PROF_H */
162