elf_getscn.c revision 361df7da6dfecd817b27e62b91752ac316d7cdd4
1b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Get section at specific index. 2b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 Red Hat, Inc. 3361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper This file is part of Red Hat elfutils. 4b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Contributed by Ulrich Drepper <drepper@redhat.com>, 1998. 5b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 6361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Red Hat elfutils is free software; you can redistribute it and/or modify 7361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper it under the terms of the GNU General Public License as published by the 8361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Free Software Foundation; version 2 of the License. 9b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 10361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Red Hat elfutils is distributed in the hope that it will be useful, but 11361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper WITHOUT ANY WARRANTY; without even the implied warranty of 12361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper General Public License for more details. 14b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 15361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper You should have received a copy of the GNU General Public License along 16361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper with Red Hat elfutils; if not, write to the Free Software Foundation, 17361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. 18361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper 19361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper In addition, as a special exception, Red Hat, Inc. gives You the 20361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper additional right to link the code of Red Hat elfutils with code licensed 21361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper under any Open Source Initiative certified open source license 22361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper (http://www.opensource.org/licenses/index.php) which requires the 23361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper distribution of source code with any binary distribution and to 24361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper distribute linked combinations of the two. Non-GPL Code permitted under 25361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper this exception must only link to the code of Red Hat elfutils through 26361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper those well defined interfaces identified in the file named EXCEPTION 27361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper found in the source code files (the "Approved Interfaces"). The files 28361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper of Non-GPL Code may instantiate templates or use macros or inline 29361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper functions from the Approved Interfaces without causing the resulting 30361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper work to be covered by the GNU General Public License. Only Red Hat, 31361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Inc. may make changes or additions to the list of Approved Interfaces. 32361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Red Hat's grant of this exception is conditioned upon your not adding 33361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper any new exceptions. If you wish to add a new Approved Interface or 34361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper exception, please contact Red Hat. You must obey the GNU General Public 35361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper License in all respects for all of the Red Hat elfutils code and other 36361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper code used in conjunction with Red Hat elfutils except the Non-GPL Code 37361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper covered by this exception. If you modify this file, you may extend this 38361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper exception to your version of the file, but you are not obligated to do 39361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper so. If you do not wish to provide this exception without modification, 40361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper you must delete this exception statement from your version and license 41361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper this file solely under the GPL without exception. 42361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper 43361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Red Hat elfutils is an included package of the Open Invention Network. 44361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper An included package of the Open Invention Network is a package for which 45361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Open Invention Network licensees cross-license their patents. No patent 46361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper license is granted, either expressly or impliedly, by designation as an 47361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper included package. Should you wish to participate in the Open Invention 48361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper Network licensing program, please visit www.openinventionnetwork.com 49361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper <http://www.openinventionnetwork.com>. */ 50b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 51b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#ifdef HAVE_CONFIG_H 52b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper# include <config.h> 53b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#endif 54b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 55b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <assert.h> 56b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stddef.h> 57b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stdlib.h> 58b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 59b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include "libelfP.h" 60b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 61b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 62b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperElf_Scn * 63b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperelf_getscn (elf, idx) 64b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Elf *elf; 65b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper size_t idx; 66b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{ 67b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (elf == NULL) 68b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return NULL; 69b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 70b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (unlikely (elf->kind != ELF_K_ELF)) 71b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 72b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper __libelf_seterrno (ELF_E_INVALID_HANDLE); 73b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return NULL; 74b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 75b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 76b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper rwlock_rdlock (elf->lock); 77b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 78b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Elf_Scn *result = NULL; 79b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 80b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Find the section in the list. */ 81b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Elf_ScnList *runp = (elf->class == ELFCLASS32 82b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper || (offsetof (struct Elf, state.elf32.scns) 83b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper == offsetof (struct Elf, state.elf64.scns)) 84b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper ? &elf->state.elf32.scns : &elf->state.elf64.scns); 85b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper while (1) 86b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 87b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (idx < runp->max) 88b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 89b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (idx < runp->cnt) 90b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper result = &runp->data[idx]; 91b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper else 92b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper __libelf_seterrno (ELF_E_INVALID_INDEX); 93b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper break; 94b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 95b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 96b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper idx -= runp->max; 97b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 98b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper runp = runp->next; 99b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (runp == NULL) 100b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 101b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper __libelf_seterrno (ELF_E_INVALID_INDEX); 102b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper break; 103b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 104b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 105b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 106b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper rwlock_unlock (elf->lock); 107b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 108b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return result; 109b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper} 110b08d5a8fb42f4586d756068065186b5af7e48daUlrich DrepperINTDEF(elf_getscn) 111