4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #pragma ident "%Z%%M% %I% %E% SMI"
41 #include <sys/param.h>
46 static void (*terminate_cleanup
)() = NULL
;
48 /* returns 1 if s1 == s2, 0 otherwise */
50 streq(const char *s1
, const char *s2
)
55 } else if (s2
== NULL
)
57 else if (strcmp(s1
, s2
) != 0)
64 findelfsecidx(Elf
*elf
, const char *file
, const char *tofind
)
70 if (gelf_getehdr(elf
, &ehdr
) == NULL
)
71 elfterminate(file
, "Couldn't read ehdr");
73 while ((scn
= elf_nextscn(elf
, scn
)) != NULL
) {
76 if (gelf_getshdr(scn
, &shdr
) == NULL
) {
78 "Couldn't read header for section %d",
82 if ((name
= elf_strptr(elf
, ehdr
.e_shstrndx
,
83 (size_t)shdr
.sh_name
)) == NULL
) {
85 "Couldn't get name for section %d",
89 if (strcmp(name
, tofind
) == 0)
90 return (elf_ndxscn(scn
));
101 if (gelf_getehdr(elf
, &ehdr
) == NULL
) {
102 terminate("failed to read ELF header: %s\n",
106 if (ehdr
.e_ident
[EI_CLASS
] == ELFCLASS32
)
108 else if (ehdr
.e_ident
[EI_CLASS
] == ELFCLASS64
)
111 terminate("unknown ELF class %d\n", ehdr
.e_ident
[EI_CLASS
]);
119 whine(char *type
, char *format
, va_list ap
)
123 fprintf(stderr
, "%s: %s: ", type
, progname
);
124 vfprintf(stderr
, format
, ap
);
126 if (format
[strlen(format
) - 1] != '\n')
127 fprintf(stderr
, ": %s\n", strerror(error
));
131 set_terminate_cleanup(void (*cleanup
)())
133 terminate_cleanup
= cleanup
;
138 terminate(char *format
, ...)
142 va_start(ap
, format
);
143 whine("ERROR", format
, ap
);
146 if (terminate_cleanup
)
149 if (getenv("CTF_ABORT_ON_TERMINATE") != NULL
)
156 aborterr(char *format
, ...)
160 va_start(ap
, format
);
161 whine("ERROR", format
, ap
);
169 warning(char *format
, ...)
173 va_start(ap
, format
);
174 whine("WARNING", format
, ap
);
177 if (debug_level
>= 3)
178 terminate("Termination due to warning\n");
183 vadebug(int level
, char *format
, va_list ap
)
185 if (level
> debug_level
)
188 (void) fprintf(DEBUG_STREAM
, "DEBUG: ");
189 (void) vfprintf(DEBUG_STREAM
, format
, ap
);
190 fflush(DEBUG_STREAM
);
195 debug(int level
, char *format
, ...)
199 if (level
> debug_level
)
202 va_start(ap
, format
);
203 (void) vadebug(level
, format
, ap
);
208 mktmpname(const char *origname
, const char *suffix
)
212 newname
= xmalloc(strlen(origname
) + strlen(suffix
) + 1);
213 (void) strcpy(newname
, origname
);
214 (void) strcat(newname
, suffix
);
220 elfterminate(const char *file
, const char *fmt
, ...)
222 static char msgbuf
[BUFSIZ
];
226 vsnprintf(msgbuf
, sizeof (msgbuf
), fmt
, ap
);
229 terminate("%s: %s: %s\n", file
, msgbuf
, elf_errmsg(-1));
233 tdesc_name(tdesc_t
*tdp
)
235 return (tdp
->t_name
== NULL
? "(anon)" : tdp
->t_name
);