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 #ifdef	__cplusplus
31 extern "C" {
32 #endif
33 
34 /*
35  * include headers
36  */
37 
38 #include <stdio.h>
39 #include <string.h>
40 #include <stdlib.h>
41 #include <unistd.h>
42 #include <fcntl.h>
43 #include <libelf.h>
44 #include <link.h>
45 #include <sys/elf_SPARC.h>
46 #include <sys/utsname.h>
47 #include <errno.h>
48 
49 /*
50  * Declaration of global variables
51  */
52 
53 #define	DEFBKTS		24997	/* 3571 nice big prime number */
54 #define	MASK		(~(unsigned long)0<<28)
55 
56 /*
57  * bucket struct of hash table
58  */
59 typedef struct binding_bucket
60 {
61 	char			*sym;
62 	char			*ref_lib;
63 	char			*def_lib;
64 	char			*obj;
65 	char			*section;
66 	char			*sttype;
67 	char			*stbind;
68 } binding_bucket;
69 
70 static binding_bucket	bkts[DEFBKTS];
71 
72 /*
73  * data structure for linked list of DT_NEEDED entries
74  */
75 typedef struct dt_list_tag
76 {
77 	char			*libname;
78 #if	defined(_LP64)
79 	Elf64_Sword		d_tag;
80 #else
81 	Elf32_Sword		d_tag;
82 #endif
83 	struct dt_list_tag	*next;
84 } dt_list;
85 
86 static dt_list		*dt_needed = NULL; /* ptr to link list of dtneeded */
87 
88 /*
89  * struct for the binary object under test
90  */
91 typedef struct obj_com
92 {
93 	char		**filenames;	/* name of application file */
94 	char		*filename;
95 	int		numfiles;	/* number of applications to check */
96 	/* ---Current application ELF file information--- */
97 	char		*ename;	/* name of current ELF file */
98 	int		fd;	/* file descriptor for current file */
99 	Elf		*elf;	/* elf descriptor for current file */
100 #if	defined(_LP64)
101 	Elf64_Ehdr	*ehdr;	/* 64 bit elf header for current file */
102 	Elf64_Phdr	*phdr;	/* 64 bit prog header for current file */
103 	Elf64_Dyn	*dynsect;	/* pointer to 64 bit dynamic section */
104 #else
105 	Elf32_Ehdr    	*ehdr;	/* 32 bit elf header for current file */
106 	Elf32_Phdr    	*phdr;	/* 32 bit prog header for current file */
107 	Elf32_Dyn	*dynsect;	/* ptr to 64 bit dynamic section */
108 #endif
109 	Elf_Data	*ddata;	/* ptr to dstring table data descriptor */
110 	char		*dynnames; /* pointer to dynamic string table */
111 	/* ---ELF file symbol table information--- */
112 	/* dynamic symbol table */
113 #if	defined(_LP64)
114 	Elf64_Sym	*dsym_tab;
115 #else
116 	Elf32_Sym	*dsym_tab;
117 #endif
118 	Elf_Data	*dsym_data;
119 	int		dsym_num;
120 	char		*dsym_names;
121 	/* regular symbol table */
122 #if	defined(_LP64)
123 	Elf64_Sym	*sym_tab;
124 #else
125 	Elf32_Sym	*sym_tab;
126 #endif
127 	Elf_Data	*sym_data;
128 	int		sym_num;
129 	char		*sym_names;
130 } obj_com;
131 
132 /*
133  * struct of the linked list of object files
134  */
135 typedef struct obj_list_tag
136 {
137 	obj_com		*obj;
138 	struct obj_list_tag	*next;
139 } obj_list;
140 
141 static int	oflag = 0;		/* flag for redirecting output */
142 static int	pflag = 0;		/* flag for profiling to stdout */
143 static int	sflag = 1;		/* flag for silent mode */
144 static int	aflag = 1;		/* flag for read input as archive */
145 extern int	errno;			/* file opening error return code */
146 static FILE	*OUTPUT_FD = stdout;	/* output fd: default as stdout */
147 static char	*outputfile;		/* full pathname of output file */
148 
149 #define	SUCCEED		0
150 #define	FAIL		1
151 
152 #define	TRUE		1
153 #define	FALSE		0
154 
155 #ifdef	__cplusplus
156 }
157 #endif
158 
159 #endif	/* _STATIC_PROF_H */
160