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 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 74*62b628a6SAli Bahrami elf_getphnum(Elf *elf, size_t *phnum) 75*62b628a6SAli Bahrami { 76*62b628a6SAli Bahrami return (elf_getphdrnum(elf, phnum) == 0); 7730da1432Sahl } 78