130da1432Sahl /*
230da1432Sahl * CDDL HEADER START
330da1432Sahl *
430da1432Sahl * The contents of this file are subject to the terms of the
5*62b628a6SAli Bahrami * Common Development and Distribution License (the "License").
6*62b628a6SAli Bahrami * You may not use this file except in compliance with the License.
730da1432Sahl *
830da1432Sahl * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
930da1432Sahl * or http://www.opensolaris.org/os/licensing.
1030da1432Sahl * See the License for the specific language governing permissions
1130da1432Sahl * and limitations under the License.
1230da1432Sahl *
1330da1432Sahl * When distributing Covered Code, include this CDDL HEADER in each
1430da1432Sahl * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1530da1432Sahl * If applicable, add the following below this CDDL HEADER, with the
1630da1432Sahl * fields enclosed by brackets "[]" replaced with your own identifying
1730da1432Sahl * information: Portions Copyright [yyyy] [name of copyright owner]
1830da1432Sahl *
1930da1432Sahl * CDDL HEADER END
2030da1432Sahl */
2130da1432Sahl /*
22*62b628a6SAli Bahrami * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
2330da1432Sahl * Use is subject to license terms.
2430da1432Sahl */
2530da1432Sahl
2630da1432Sahl #include <string.h>
2730da1432Sahl #include <gelf.h>
2830da1432Sahl #include <decl.h>
2930da1432Sahl #include <msg.h>
3030da1432Sahl
31*62b628a6SAli Bahrami /*
32*62b628a6SAli Bahrami * Return number of entries in the program header array, taking
33*62b628a6SAli Bahrami * extended headers into account.
34*62b628a6SAli Bahrami *
35*62b628a6SAli Bahrami * elf_getphnum() was defined based on the definition of the earlier
36*62b628a6SAli Bahrami * elf_getshnum(). It returns 0 for failure, and 1 for success.
37*62b628a6SAli Bahrami *
38*62b628a6SAli Bahrami * elf_getphdrnum() supercedes elf_getphnum(), which is now considered
39*62b628a6SAli Bahrami * obsolete. It returns -1 for failure and 0 for success, matching
40*62b628a6SAli Bahrami * elf_getshdrnum(), and bringing us into alignment with the interface
41*62b628a6SAli Bahrami * agreed to in the 2002 gABI meeting.
42*62b628a6SAli Bahrami *
43*62b628a6SAli Bahrami * See the comment in getshnum.c for additional information.
44*62b628a6SAli Bahrami */
45*62b628a6SAli Bahrami
4630da1432Sahl int
elf_getphdrnum(Elf * elf,size_t * phnum)47*62b628a6SAli Bahrami elf_getphdrnum(Elf *elf, size_t *phnum)
4830da1432Sahl {
4930da1432Sahl GElf_Ehdr ehdr;
5030da1432Sahl Elf_Scn *scn;
5130da1432Sahl GElf_Shdr shdr0;
5230da1432Sahl
5330da1432Sahl if (gelf_getehdr(elf, &ehdr) == NULL)
54*62b628a6SAli Bahrami return (-1);
5530da1432Sahl
5630da1432Sahl if (ehdr.e_phnum != PN_XNUM) {
5730da1432Sahl *phnum = ehdr.e_phnum;
58*62b628a6SAli Bahrami return (0);
5930da1432Sahl }
6030da1432Sahl
6130da1432Sahl if ((scn = elf_getscn(elf, 0)) == NULL ||
6230da1432Sahl gelf_getshdr(scn, &shdr0) == NULL)
63*62b628a6SAli Bahrami return (-1);
6430da1432Sahl
6530da1432Sahl if (shdr0.sh_info == 0)
6630da1432Sahl *phnum = ehdr.e_phnum;
6730da1432Sahl else
6830da1432Sahl *phnum = shdr0.sh_info;
6930da1432Sahl
70*62b628a6SAli Bahrami return (0);
71*62b628a6SAli Bahrami }
72*62b628a6SAli Bahrami
73*62b628a6SAli Bahrami int
elf_getphnum(Elf * elf,size_t * phnum)74*62b628a6SAli Bahrami elf_getphnum(Elf *elf, size_t *phnum)
75*62b628a6SAli Bahrami {
76*62b628a6SAli Bahrami return (elf_getphdrnum(elf, phnum) == 0);
7730da1432Sahl }
78