gelf_update_verneed.c revision 361df7da6dfecd817b27e62b91752ac316d7cdd4
1b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper/* Update required symbol version information. 2b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Copyright (C) 2001, 2002 Red Hat, Inc. 3361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper This file is part of Red Hat elfutils. 4b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Written by Ulrich Drepper <drepper@redhat.com>, 2001. 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. 9361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich 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. 14361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich 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 <gelf.h> 57b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <string.h> 58b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 59b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include "libelfP.h" 60b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 61b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 62b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperint 63b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppergelf_update_verneed (data, offset, src) 64b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Elf_Data *data; 65b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper int offset; 66b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper GElf_Verneed *src; 67b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{ 68b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper Elf_Data_Scn *data_scn = (Elf_Data_Scn *) data; 69b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 70b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (data == NULL) 71b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return 0; 72b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 73b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* The types for 32 and 64 bit are the same. Lucky us. */ 74b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper assert (sizeof (GElf_Verneed) == sizeof (Elf32_Verneed)); 75b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper assert (sizeof (GElf_Verneed) == sizeof (Elf64_Verneed)); 76b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 77b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Check whether we have to resize the data buffer. */ 78b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (unlikely (offset < 0) 79b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper || unlikely ((offset + sizeof (GElf_Verneed)) > data_scn->d.d_size)) 80b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 81b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper __libelf_seterrno (ELF_E_INVALID_INDEX); 82b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return 0; 83b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 84b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 85b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper if (unlikely (data_scn->d.d_type != ELF_T_VNEED)) 86b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper { 87b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* The type of the data better should match. */ 88b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper __libelf_seterrno (ELF_E_DATA_MISMATCH); 89b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return 0; 90b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 91b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 92b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper rwlock_wrlock (data_scn->s->elf->lock); 93b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 94b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper memcpy ((char *) data_scn->d.d_buf + offset, src, sizeof (GElf_Verneed)); 95b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 96b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /* Mark the section as modified. */ 97b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper data_scn->s->flags |= ELF_F_DIRTY; 98b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 99b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper rwlock_unlock (data_scn->s->elf->lock); 100b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 101b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return 1; 102b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper} 103