elf_begin.c revision cc6695e2684ce93cdf8bd2da63d55d2cf49ff076
1/* Create descriptor for processing file.
2   Copyright (C) 1998-2005, 2006, 2007, 2008 Red Hat, Inc.
3   This file is part of Red Hat elfutils.
4   Written by Ulrich Drepper <drepper@redhat.com>, 1998.
5
6   Red Hat elfutils is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by the
8   Free Software Foundation; version 2 of the License.
9
10   Red Hat elfutils is distributed in the hope that it will be useful, but
11   WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13   General Public License for more details.
14
15   You should have received a copy of the GNU General Public License along
16   with Red Hat elfutils; if not, write to the Free Software Foundation,
17   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
18
19   In addition, as a special exception, Red Hat, Inc. gives You the
20   additional right to link the code of Red Hat elfutils with code licensed
21   under any Open Source Initiative certified open source license
22   (http://www.opensource.org/licenses/index.php) which requires the
23   distribution of source code with any binary distribution and to
24   distribute linked combinations of the two.  Non-GPL Code permitted under
25   this exception must only link to the code of Red Hat elfutils through
26   those well defined interfaces identified in the file named EXCEPTION
27   found in the source code files (the "Approved Interfaces").  The files
28   of Non-GPL Code may instantiate templates or use macros or inline
29   functions from the Approved Interfaces without causing the resulting
30   work to be covered by the GNU General Public License.  Only Red Hat,
31   Inc. may make changes or additions to the list of Approved Interfaces.
32   Red Hat's grant of this exception is conditioned upon your not adding
33   any new exceptions.  If you wish to add a new Approved Interface or
34   exception, please contact Red Hat.  You must obey the GNU General Public
35   License in all respects for all of the Red Hat elfutils code and other
36   code used in conjunction with Red Hat elfutils except the Non-GPL Code
37   covered by this exception.  If you modify this file, you may extend this
38   exception to your version of the file, but you are not obligated to do
39   so.  If you do not wish to provide this exception without modification,
40   you must delete this exception statement from your version and license
41   this file solely under the GPL without exception.
42
43   Red Hat elfutils is an included package of the Open Invention Network.
44   An included package of the Open Invention Network is a package for which
45   Open Invention Network licensees cross-license their patents.  No patent
46   license is granted, either expressly or impliedly, by designation as an
47   included package.  Should you wish to participate in the Open Invention
48   Network licensing program, please visit www.openinventionnetwork.com
49   <http://www.openinventionnetwork.com>.  */
50
51#ifdef HAVE_CONFIG_H
52# include <config.h>
53#endif
54
55#include <assert.h>
56#include <ctype.h>
57#include <errno.h>
58#include <fcntl.h>
59#include <stdbool.h>
60#include <stddef.h>
61#include <string.h>
62#include <unistd.h>
63#include <sys/mman.h>
64#include <sys/param.h>
65#include <sys/stat.h>
66
67#include <system.h>
68#include "libelfP.h"
69#include "common.h"
70
71/* Create descriptor for archive in memory.  */
72static inline Elf *
73file_read_ar (int fildes, void *map_address, off_t offset, size_t maxsize,
74	      Elf_Cmd cmd, Elf *parent)
75{
76  Elf *elf;
77
78  /* Create a descriptor.  */
79  elf = allocate_elf (fildes, map_address, offset, maxsize, cmd, parent,
80                      ELF_K_AR, 0);
81  if (elf != NULL)
82    {
83      /* We don't read all the symbol tables in advance.  All this will
84	 happen on demand.  */
85      elf->state.ar.offset = offset + SARMAG;
86
87      elf->state.ar.elf_ar_hdr.ar_rawname = elf->state.ar.raw_name;
88    }
89
90  return elf;
91}
92
93
94static size_t
95get_shnum (void *map_address, unsigned char *e_ident, int fildes, off_t offset,
96	   size_t maxsize)
97{
98  size_t result;
99  union
100  {
101    Elf32_Ehdr *e32;
102    Elf64_Ehdr *e64;
103    void *p;
104  } ehdr;
105  union
106  {
107    Elf32_Ehdr e32;
108    Elf64_Ehdr e64;
109  } ehdr_mem;
110  bool is32 = e_ident[EI_CLASS] == ELFCLASS32;
111
112  /* Make the ELF header available.  */
113  if (e_ident[EI_DATA] == MY_ELFDATA
114      && (ALLOW_UNALIGNED
115	  || (((size_t) e_ident
116	       & ((is32 ? __alignof__ (Elf32_Ehdr) : __alignof__ (Elf64_Ehdr))
117		  - 1)) == 0)))
118    ehdr.p = e_ident;
119  else
120    {
121      /* We already read the ELF header.  We have to copy the header
122	 since we possibly modify the data here and the caller
123	 expects the memory it passes in to be preserved.  */
124      ehdr.p = &ehdr_mem;
125
126      if (is32)
127	{
128	  if (ALLOW_UNALIGNED)
129	    {
130	      ehdr_mem.e32.e_shnum = ((Elf32_Ehdr *) e_ident)->e_shnum;
131	      ehdr_mem.e32.e_shoff = ((Elf32_Ehdr *) e_ident)->e_shoff;
132	    }
133	  else
134	    memcpy (&ehdr_mem, e_ident, sizeof (Elf32_Ehdr));
135
136	  if (e_ident[EI_DATA] != MY_ELFDATA)
137	    {
138	      CONVERT (ehdr_mem.e32.e_shnum);
139	      CONVERT (ehdr_mem.e32.e_shoff);
140	    }
141	}
142      else
143	{
144	  if (ALLOW_UNALIGNED)
145	    {
146	      ehdr_mem.e64.e_shnum = ((Elf64_Ehdr *) e_ident)->e_shnum;
147	      ehdr_mem.e64.e_shoff = ((Elf64_Ehdr *) e_ident)->e_shoff;
148	    }
149	  else
150	    memcpy (&ehdr_mem, e_ident, sizeof (Elf64_Ehdr));
151
152	  if (e_ident[EI_DATA] != MY_ELFDATA)
153	    {
154	      CONVERT (ehdr_mem.e64.e_shnum);
155	      CONVERT (ehdr_mem.e64.e_shoff);
156	    }
157	}
158    }
159
160  if (is32)
161    {
162      /* Get the number of sections from the ELF header.  */
163      result = ehdr.e32->e_shnum;
164
165      if (unlikely (result == 0) && ehdr.e32->e_shoff != 0)
166	{
167	  if (ehdr.e32->e_shoff + sizeof (Elf32_Shdr) > maxsize)
168	    /* Cannot read the first section header.  */
169	    return 0;
170
171	  if (likely (map_address != NULL) && e_ident[EI_DATA] == MY_ELFDATA
172	      && (ALLOW_UNALIGNED
173		  || (((size_t) ((char *) map_address + offset))
174		      & (__alignof__ (Elf32_Ehdr) - 1)) == 0))
175	    /* We can directly access the memory.  */
176	    result = ((Elf32_Shdr *) ((char *) map_address + ehdr.e32->e_shoff
177				      + offset))->sh_size;
178	  else
179	    {
180	      Elf32_Word size;
181
182	      if (likely (map_address != NULL))
183		/* gcc will optimize the memcpy to a simple memory
184		   access while taking care of alignment issues.  */
185		memcpy (&size, &((Elf32_Shdr *) ((char *) map_address
186						 + ehdr.e32->e_shoff
187						 + offset))->sh_size,
188			sizeof (Elf32_Word));
189	      else
190		if (unlikely (pread_retry (fildes, &size, sizeof (Elf32_Word),
191					   offset + ehdr.e32->e_shoff
192					   + offsetof (Elf32_Shdr, sh_size))
193			      != sizeof (Elf32_Word)))
194		  return (size_t) -1l;
195
196	      if (e_ident[EI_DATA] != MY_ELFDATA)
197		CONVERT (size);
198
199	      result = size;
200	    }
201	}
202
203      /* If the section headers were truncated, pretend none were there.  */
204      if (ehdr.e32->e_shoff > maxsize
205	  || maxsize - ehdr.e32->e_shoff < sizeof (Elf32_Shdr) * result)
206	result = 0;
207    }
208  else
209    {
210      /* Get the number of sections from the ELF header.  */
211      result = ehdr.e64->e_shnum;
212
213      if (unlikely (result == 0) && ehdr.e64->e_shoff != 0)
214	{
215	  if (ehdr.e64->e_shoff + sizeof (Elf64_Shdr) > maxsize)
216	    /* Cannot read the first section header.  */
217	    return 0;
218
219	  Elf64_Xword size;
220	  if (likely (map_address != NULL) && e_ident[EI_DATA] == MY_ELFDATA
221	      && (ALLOW_UNALIGNED
222		  || (((size_t) ((char *) map_address + offset))
223		      & (__alignof__ (Elf64_Ehdr) - 1)) == 0))
224	    /* We can directly access the memory.  */
225	    size = ((Elf64_Shdr *) ((char *) map_address + ehdr.e64->e_shoff
226				    + offset))->sh_size;
227	  else
228	    {
229	      if (likely (map_address != NULL))
230		/* gcc will optimize the memcpy to a simple memory
231		   access while taking care of alignment issues.  */
232		memcpy (&size, &((Elf64_Shdr *) ((char *) map_address
233						 + ehdr.e64->e_shoff
234						 + offset))->sh_size,
235			sizeof (Elf64_Xword));
236	      else
237		if (unlikely (pread_retry (fildes, &size, sizeof (Elf64_Word),
238					   offset + ehdr.e64->e_shoff
239					   + offsetof (Elf64_Shdr, sh_size))
240			      != sizeof (Elf64_Xword)))
241		  return (size_t) -1l;
242
243	      if (e_ident[EI_DATA] != MY_ELFDATA)
244		CONVERT (size);
245	    }
246
247	  if (size > ~((GElf_Word) 0))
248	    /* Invalid value, it is too large.  */
249	    return (size_t) -1l;
250
251	  result = size;
252	}
253
254      /* If the section headers were truncated, pretend none were there.  */
255      if (ehdr.e64->e_shoff > maxsize
256	  || maxsize - ehdr.e64->e_shoff < sizeof (Elf64_Shdr) * result)
257	result = 0;
258    }
259
260  return result;
261}
262
263
264/* Create descriptor for ELF file in memory.  */
265static Elf *
266file_read_elf (int fildes, void *map_address, unsigned char *e_ident,
267	       off_t offset, size_t maxsize, Elf_Cmd cmd, Elf *parent)
268{
269  /* Verify the binary is of the class we can handle.  */
270  if (unlikely ((e_ident[EI_CLASS] != ELFCLASS32
271		 && e_ident[EI_CLASS] != ELFCLASS64)
272		/* We also can only handle two encodings.  */
273		|| (e_ident[EI_DATA] != ELFDATA2LSB
274		    && e_ident[EI_DATA] != ELFDATA2MSB)))
275    {
276      /* Cannot handle this.  */
277      __libelf_seterrno (ELF_E_INVALID_FILE);
278      return NULL;
279    }
280
281  /* Determine the number of sections.  */
282  size_t scncnt = get_shnum (map_address, e_ident, fildes, offset, maxsize);
283  if (scncnt == (size_t) -1l)
284    /* Could not determine the number of sections.  */
285    return NULL;
286
287  /* We can now allocate the memory.  */
288  Elf *elf = allocate_elf (fildes, map_address, offset, maxsize, cmd, parent,
289			   ELF_K_ELF, scncnt * sizeof (Elf_Scn));
290  if (elf == NULL)
291    /* Not enough memory.  */
292    return NULL;
293
294  /* Some more or less arbitrary value.  */
295  elf->state.elf.scnincr = 10;
296
297  /* Make the class easily available.  */
298  elf->class = e_ident[EI_CLASS];
299
300  if (e_ident[EI_CLASS] == ELFCLASS32)
301    {
302      /* This pointer might not be directly usable if the alignment is
303	 not sufficient for the architecture.  */
304      Elf32_Ehdr *ehdr = (Elf32_Ehdr *) ((char *) map_address + offset);
305
306      assert ((unsigned int) scncnt == scncnt);
307      elf->state.elf32.scns.cnt = elf->state.elf32.scns.max = scncnt;
308
309      /* This is a 32-bit binary.  */
310      if (map_address != NULL && e_ident[EI_DATA] == MY_ELFDATA
311	  && (ALLOW_UNALIGNED
312	      || ((((uintptr_t) ehdr) & (__alignof__ (Elf32_Ehdr) - 1)) == 0
313		  && ((uintptr_t) ((char *) ehdr + ehdr->e_shoff)
314		      & (__alignof__ (Elf32_Shdr) - 1)) == 0
315		  && ((uintptr_t) ((char *) ehdr + ehdr->e_phoff)
316		      & (__alignof__ (Elf32_Phdr) - 1)) == 0)))
317	{
318	  /* We can use the mmapped memory.  */
319	  elf->state.elf32.ehdr = ehdr;
320	  elf->state.elf32.shdr
321	    = (Elf32_Shdr *) ((char *) ehdr + ehdr->e_shoff);
322	  if (ehdr->e_phnum > 0)
323	    /* Assign a value only if there really is a program
324	       header.  Otherwise the value remains NULL.  */
325	    elf->state.elf32.phdr
326	      = (Elf32_Phdr *) ((char *) ehdr + ehdr->e_phoff);
327
328	  for (size_t cnt = 0; cnt < scncnt; ++cnt)
329	    {
330	      elf->state.elf32.scns.data[cnt].index = cnt;
331	      elf->state.elf32.scns.data[cnt].elf = elf;
332	      elf->state.elf32.scns.data[cnt].shdr.e32 =
333		&elf->state.elf32.shdr[cnt];
334	      elf->state.elf32.scns.data[cnt].rawdata_base =
335		elf->state.elf32.scns.data[cnt].data_base =
336		((char *) map_address + offset
337		 + elf->state.elf32.shdr[cnt].sh_offset);
338	      elf->state.elf32.scns.data[cnt].list = &elf->state.elf32.scns;
339
340	      /* If this is a section with an extended index add a
341		 reference in the section which uses the extended
342		 index.  */
343	      if (elf->state.elf32.shdr[cnt].sh_type == SHT_SYMTAB_SHNDX
344		  && elf->state.elf32.shdr[cnt].sh_link < scncnt)
345		elf->state.elf32.scns.data[elf->state.elf32.shdr[cnt].sh_link].shndx_index
346		  = cnt;
347
348	      /* Set the own shndx_index field in case it has not yet
349		 been set.  */
350	      if (elf->state.elf32.scns.data[cnt].shndx_index == 0)
351		elf->state.elf32.scns.data[cnt].shndx_index = -1;
352	    }
353	}
354      else
355	{
356	  /* Copy the ELF header.  */
357	  elf->state.elf32.ehdr = memcpy (&elf->state.elf32.ehdr_mem, e_ident,
358					  sizeof (Elf32_Ehdr));
359
360	  if (e_ident[EI_DATA] != MY_ELFDATA)
361	    {
362	      CONVERT (elf->state.elf32.ehdr_mem.e_type);
363	      CONVERT (elf->state.elf32.ehdr_mem.e_machine);
364	      CONVERT (elf->state.elf32.ehdr_mem.e_version);
365	      CONVERT (elf->state.elf32.ehdr_mem.e_entry);
366	      CONVERT (elf->state.elf32.ehdr_mem.e_phoff);
367	      CONVERT (elf->state.elf32.ehdr_mem.e_shoff);
368	      CONVERT (elf->state.elf32.ehdr_mem.e_flags);
369	      CONVERT (elf->state.elf32.ehdr_mem.e_ehsize);
370	      CONVERT (elf->state.elf32.ehdr_mem.e_phentsize);
371	      CONVERT (elf->state.elf32.ehdr_mem.e_phnum);
372	      CONVERT (elf->state.elf32.ehdr_mem.e_shentsize);
373	      CONVERT (elf->state.elf32.ehdr_mem.e_shnum);
374	      CONVERT (elf->state.elf32.ehdr_mem.e_shstrndx);
375	    }
376
377	  for (size_t cnt = 0; cnt < scncnt; ++cnt)
378	    {
379	      elf->state.elf32.scns.data[cnt].index = cnt;
380	      elf->state.elf32.scns.data[cnt].elf = elf;
381	      elf->state.elf32.scns.data[cnt].list = &elf->state.elf32.scns;
382	    }
383	}
384
385      /* So far only one block with sections.  */
386      elf->state.elf32.scns_last = &elf->state.elf32.scns;
387    }
388  else
389    {
390      /* This pointer might not be directly usable if the alignment is
391	 not sufficient for the architecture.  */
392      Elf64_Ehdr *ehdr = (Elf64_Ehdr *) ((char *) map_address + offset);
393
394      assert ((unsigned int) scncnt == scncnt);
395      elf->state.elf64.scns.cnt = elf->state.elf64.scns.max = scncnt;
396
397      /* This is a 64-bit binary.  */
398      if (map_address != NULL && e_ident[EI_DATA] == MY_ELFDATA
399	  && (ALLOW_UNALIGNED
400	      || ((((uintptr_t) ehdr) & (__alignof__ (Elf64_Ehdr) - 1)) == 0
401		  && ((uintptr_t) ((char *) ehdr + ehdr->e_shoff)
402		      & (__alignof__ (Elf64_Shdr) - 1)) == 0
403		  && ((uintptr_t) ((char *) ehdr + ehdr->e_phoff)
404		      & (__alignof__ (Elf64_Phdr) - 1)) == 0)))
405	{
406	  /* We can use the mmapped memory.  */
407	  elf->state.elf64.ehdr = ehdr;
408	  elf->state.elf64.shdr
409	    = (Elf64_Shdr *) ((char *) ehdr + ehdr->e_shoff);
410	  if (ehdr->e_phnum > 0)
411	    /* Assign a value only if there really is a program
412	       header.  Otherwise the value remains NULL.  */
413	    elf->state.elf64.phdr
414	      = (Elf64_Phdr *) ((char *) ehdr + ehdr->e_phoff);
415
416	  for (size_t cnt = 0; cnt < scncnt; ++cnt)
417	    {
418	      elf->state.elf64.scns.data[cnt].index = cnt;
419	      elf->state.elf64.scns.data[cnt].elf = elf;
420	      elf->state.elf64.scns.data[cnt].shdr.e64 =
421		&elf->state.elf64.shdr[cnt];
422	      elf->state.elf64.scns.data[cnt].rawdata_base =
423		elf->state.elf64.scns.data[cnt].data_base =
424		((char *) map_address + offset
425		 + elf->state.elf64.shdr[cnt].sh_offset);
426	      elf->state.elf64.scns.data[cnt].list = &elf->state.elf64.scns;
427
428	      /* If this is a section with an extended index add a
429		 reference in the section which uses the extended
430		 index.  */
431	      if (elf->state.elf64.shdr[cnt].sh_type == SHT_SYMTAB_SHNDX
432		  && elf->state.elf64.shdr[cnt].sh_link < scncnt)
433		elf->state.elf64.scns.data[elf->state.elf64.shdr[cnt].sh_link].shndx_index
434		  = cnt;
435
436	      /* Set the own shndx_index field in case it has not yet
437		 been set.  */
438	      if (elf->state.elf64.scns.data[cnt].shndx_index == 0)
439		elf->state.elf64.scns.data[cnt].shndx_index = -1;
440	    }
441	}
442      else
443	{
444	  /* Copy the ELF header.  */
445	  elf->state.elf64.ehdr = memcpy (&elf->state.elf64.ehdr_mem, e_ident,
446					  sizeof (Elf64_Ehdr));
447
448	  if (e_ident[EI_DATA] != MY_ELFDATA)
449	    {
450	      CONVERT (elf->state.elf64.ehdr_mem.e_type);
451	      CONVERT (elf->state.elf64.ehdr_mem.e_machine);
452	      CONVERT (elf->state.elf64.ehdr_mem.e_version);
453	      CONVERT (elf->state.elf64.ehdr_mem.e_entry);
454	      CONVERT (elf->state.elf64.ehdr_mem.e_phoff);
455	      CONVERT (elf->state.elf64.ehdr_mem.e_shoff);
456	      CONVERT (elf->state.elf64.ehdr_mem.e_flags);
457	      CONVERT (elf->state.elf64.ehdr_mem.e_ehsize);
458	      CONVERT (elf->state.elf64.ehdr_mem.e_phentsize);
459	      CONVERT (elf->state.elf64.ehdr_mem.e_phnum);
460	      CONVERT (elf->state.elf64.ehdr_mem.e_shentsize);
461	      CONVERT (elf->state.elf64.ehdr_mem.e_shnum);
462	      CONVERT (elf->state.elf64.ehdr_mem.e_shstrndx);
463	    }
464
465	  for (size_t cnt = 0; cnt < scncnt; ++cnt)
466	    {
467	      elf->state.elf64.scns.data[cnt].index = cnt;
468	      elf->state.elf64.scns.data[cnt].elf = elf;
469	      elf->state.elf64.scns.data[cnt].list = &elf->state.elf64.scns;
470	    }
471	}
472
473      /* So far only one block with sections.  */
474      elf->state.elf64.scns_last = &elf->state.elf64.scns;
475    }
476
477  return elf;
478}
479
480
481Elf *
482internal_function
483__libelf_read_mmaped_file (int fildes, void *map_address,  off_t offset,
484			   size_t maxsize, Elf_Cmd cmd, Elf *parent)
485{
486  /* We have to find out what kind of file this is.  We handle ELF
487     files and archives.  To find out what we have we must look at the
488     header.  The header for an ELF file is EI_NIDENT bytes in size,
489     the header for an archive file SARMAG bytes long.  */
490  unsigned char *e_ident = (unsigned char *) map_address + offset;
491
492  /* See what kind of object we have here.  */
493  Elf_Kind kind = determine_kind (e_ident, maxsize);
494
495  switch (kind)
496    {
497    case ELF_K_ELF:
498      return file_read_elf (fildes, map_address, e_ident, offset, maxsize,
499			    cmd, parent);
500
501    case ELF_K_AR:
502      return file_read_ar (fildes, map_address, offset, maxsize, cmd, parent);
503
504    default:
505      break;
506    }
507
508  /* This case is easy.  Since we cannot do anything with this file
509     create a dummy descriptor.  */
510  return allocate_elf (fildes, map_address, offset, maxsize, cmd, parent,
511		       ELF_K_NONE, 0);
512}
513
514
515static Elf *
516read_unmmaped_file (int fildes, off_t offset, size_t maxsize, Elf_Cmd cmd,
517		    Elf *parent)
518{
519  /* We have to find out what kind of file this is.  We handle ELF
520     files and archives.  To find out what we have we must read the
521     header.  The identification header for an ELF file is EI_NIDENT
522     bytes in size, but we read the whole ELF header since we will
523     need it anyway later.  For archives the header in SARMAG bytes
524     long.  Read the maximum of these numbers.
525
526     XXX We have to change this for the extended `ar' format some day.
527
528     Use a union to ensure alignment.  We might later access the
529     memory as a ElfXX_Ehdr.  */
530  union
531  {
532    Elf64_Ehdr ehdr;
533    unsigned char header[MAX (sizeof (Elf64_Ehdr), SARMAG)];
534  } mem;
535
536  /* Read the head of the file.  */
537  ssize_t nread = pread_retry (fildes, mem.header,
538			       MIN (MAX (sizeof (Elf64_Ehdr), SARMAG),
539				    maxsize),
540			       offset);
541  if (unlikely (nread == -1))
542    /* We cannot even read the head of the file.  Maybe FILDES is associated
543       with an unseekable device.  This is nothing we can handle.  */
544    return NULL;
545
546  /* See what kind of object we have here.  */
547  Elf_Kind kind = determine_kind (mem.header, nread);
548
549  switch (kind)
550    {
551    case ELF_K_AR:
552      return file_read_ar (fildes, NULL, offset, maxsize, cmd, parent);
553
554    case ELF_K_ELF:
555      /* Make sure at least the ELF header is contained in the file.  */
556      if ((size_t) nread >= (mem.header[EI_CLASS] == ELFCLASS32
557			     ? sizeof (Elf32_Ehdr) : sizeof (Elf64_Ehdr)))
558	return file_read_elf (fildes, NULL, mem.header, offset, maxsize, cmd,
559			      parent);
560      /* FALLTHROUGH */
561
562    default:
563      break;
564    }
565
566  /* This case is easy.  Since we cannot do anything with this file
567     create a dummy descriptor.  */
568  return allocate_elf (fildes, NULL, offset, maxsize, cmd, parent,
569		       ELF_K_NONE, 0);
570}
571
572
573/* Open a file for reading.  If possible we will try to mmap() the file.  */
574static struct Elf *
575read_file (int fildes, off_t offset, size_t maxsize,
576	   Elf_Cmd cmd, Elf *parent)
577{
578  void *map_address = NULL;
579  int use_mmap = (cmd == ELF_C_READ_MMAP || cmd == ELF_C_RDWR_MMAP
580		  || cmd == ELF_C_WRITE_MMAP
581		  || cmd == ELF_C_READ_MMAP_PRIVATE);
582
583#if _MUDFLAP
584  /* Mudflap doesn't grok that our mmap'd data is ok.  */
585  use_mmap = 0;
586#endif
587
588  if (use_mmap)
589    {
590      if (parent == NULL)
591	{
592	  if (maxsize == ~((size_t) 0))
593	    {
594	      /* We don't know in the moment how large the file is.
595		 Determine it now.  */
596	      struct stat st;
597
598	      if (fstat (fildes, &st) == 0
599		  && (sizeof (size_t) >= sizeof (st.st_size)
600		      || st.st_size <= ~((size_t) 0)))
601		maxsize = (size_t) st.st_size;
602	    }
603
604	  /* We try to map the file ourself.  */
605	  map_address = mmap (NULL, maxsize, (cmd == ELF_C_READ_MMAP
606					      ? PROT_READ
607					      : PROT_READ|PROT_WRITE),
608			      cmd == ELF_C_READ_MMAP_PRIVATE
609			      || cmd == ELF_C_READ_MMAP
610			      ? MAP_PRIVATE : MAP_SHARED,
611			      fildes, offset);
612
613	  if (map_address == MAP_FAILED)
614	    map_address = NULL;
615	}
616      else
617	{
618	  /* The parent is already loaded.  Use it.  */
619	  assert (maxsize != ~((size_t) 0));
620
621	  map_address = parent->map_address;
622	}
623    }
624
625  /* If we have the file in memory optimize the access.  */
626  if (map_address != NULL)
627    {
628      assert (map_address != MAP_FAILED);
629
630      struct Elf *result = __libelf_read_mmaped_file (fildes, map_address,
631						      offset, maxsize, cmd,
632						      parent);
633
634      /* If something went wrong during the initialization unmap the
635	 memory if we mmaped here.  */
636      if (result == NULL
637	  && (parent == NULL
638	      || parent->map_address != map_address))
639	munmap (map_address, maxsize);
640      else if (parent == NULL)
641	/* Remember that we mmap()ed the memory.  */
642	result->flags |= ELF_F_MMAPPED;
643
644      return result;
645    }
646
647  /* Otherwise we have to do it the hard way.  We read as much as necessary
648     from the file whenever we need information which is not available.  */
649  return read_unmmaped_file (fildes, offset, maxsize, cmd, parent);
650}
651
652
653/* Find the entry with the long names for the content of this archive.  */
654static const char *
655read_long_names (Elf *elf)
656{
657  off_t offset = SARMAG;	/* This is the first entry.  */
658  struct ar_hdr hdrm;
659  struct ar_hdr *hdr;
660  char *newp;
661  size_t len;
662
663  while (1)
664    {
665      if (elf->map_address != NULL)
666	{
667	  if (offset + sizeof (struct ar_hdr) > elf->maximum_size)
668	    return NULL;
669
670	  /* The data is mapped.  */
671	  hdr = (struct ar_hdr *) (elf->map_address + offset);
672	}
673      else
674	{
675	  /* Read the header from the file.  */
676	  if (unlikely (pread_retry (elf->fildes, &hdrm, sizeof (hdrm),
677				     elf->start_offset + offset)
678			!= sizeof (hdrm)))
679	    return NULL;
680
681	  hdr = &hdrm;
682	}
683
684      len = atol (hdr->ar_size);
685
686      if (memcmp (hdr->ar_name, "//              ", 16) == 0)
687	break;
688
689      offset += sizeof (struct ar_hdr) + ((len + 1) & ~1l);
690    }
691
692  /* Due to the stupid format of the long name table entry (which are not
693     NUL terminted) we have to provide an appropriate representation anyhow.
694     Therefore we always make a copy which has the appropriate form.  */
695  newp = (char *) malloc (len);
696  if (newp != NULL)
697    {
698      char *runp;
699
700      if (elf->map_address != NULL)
701	/* Simply copy it over.  */
702	elf->state.ar.long_names = (char *) memcpy (newp,
703						    elf->map_address + offset
704						    + sizeof (struct ar_hdr),
705						    len);
706      else
707	{
708	  if (unlikely ((size_t) pread_retry (elf->fildes, newp, len,
709					      elf->start_offset + offset
710					      + sizeof (struct ar_hdr))
711			!= len))
712	    {
713	      /* We were not able to read all data.  */
714	      free (newp);
715	      elf->state.ar.long_names = NULL;
716	      return NULL;
717	    }
718	  elf->state.ar.long_names = newp;
719	}
720
721      elf->state.ar.long_names_len = len;
722
723      /* Now NUL-terminate the strings.  */
724      runp = newp;
725      while (1)
726        {
727	  runp = (char *) memchr (runp, '/', newp + len - runp);
728	  if (runp == NULL)
729	    /* This was the last entry.  */
730	    break;
731
732	  /* NUL-terminate the string.  */
733	  *runp = '\0';
734
735	  /* Skip the NUL byte and the \012.  */
736	  runp += 2;
737
738	  /* A sanity check.  Somebody might have generated invalid
739	     archive.  */
740	  if (runp >= newp + len)
741	    break;
742	}
743    }
744
745  return newp;
746}
747
748
749/* Read the next archive header.  */
750int
751internal_function
752__libelf_next_arhdr_wrlock (elf)
753     Elf *elf;
754{
755  struct ar_hdr *ar_hdr;
756  Elf_Arhdr *elf_ar_hdr;
757
758  if (elf->map_address != NULL)
759    {
760      /* See whether this entry is in the file.  */
761      if (unlikely (elf->state.ar.offset + sizeof (struct ar_hdr)
762		    > elf->start_offset + elf->maximum_size))
763	{
764	  /* This record is not anymore in the file.  */
765	  __libelf_seterrno (ELF_E_RANGE);
766	  return -1;
767	}
768      ar_hdr = (struct ar_hdr *) (elf->map_address + elf->state.ar.offset);
769    }
770  else
771    {
772      ar_hdr = &elf->state.ar.ar_hdr;
773
774      if (unlikely (pread_retry (elf->fildes, ar_hdr, sizeof (struct ar_hdr),
775				 elf->state.ar.offset)
776		    != sizeof (struct ar_hdr)))
777	{
778	  /* Something went wrong while reading the file.  */
779	  __libelf_seterrno (ELF_E_RANGE);
780	  return -1;
781	}
782    }
783
784  /* One little consistency check.  */
785  if (unlikely (memcmp (ar_hdr->ar_fmag, ARFMAG, 2) != 0))
786    {
787      /* This is no valid archive.  */
788      __libelf_seterrno (ELF_E_ARCHIVE_FMAG);
789      return -1;
790    }
791
792  /* Copy the raw name over to a NUL terminated buffer.  */
793  *((char *) __mempcpy (elf->state.ar.raw_name, ar_hdr->ar_name, 16)) = '\0';
794
795  elf_ar_hdr = &elf->state.ar.elf_ar_hdr;
796
797  /* Now convert the `struct ar_hdr' into `Elf_Arhdr'.
798     Determine whether this is a special entry.  */
799  if (ar_hdr->ar_name[0] == '/')
800    {
801      if (ar_hdr->ar_name[1] == ' '
802	  && memcmp (ar_hdr->ar_name, "/               ", 16) == 0)
803	/* This is the index.  */
804	elf_ar_hdr->ar_name = memcpy (elf->state.ar.ar_name, "/", 2);
805      else if (ar_hdr->ar_name[1] == '/'
806	       && memcmp (ar_hdr->ar_name, "//              ", 16) == 0)
807	/* This is the array with the long names.  */
808	elf_ar_hdr->ar_name = memcpy (elf->state.ar.ar_name, "//", 3);
809      else if (likely  (isdigit (ar_hdr->ar_name[1])))
810	{
811	  size_t offset;
812
813	  /* This is a long name.  First we have to read the long name
814	     table, if this hasn't happened already.  */
815	  if (unlikely (elf->state.ar.long_names == NULL
816			&& read_long_names (elf) == NULL))
817	    {
818	      /* No long name table although it is reference.  The archive is
819		 broken.  */
820	      __libelf_seterrno (ELF_E_INVALID_ARCHIVE);
821	      return -1;
822	    }
823
824	  offset = atol (ar_hdr->ar_name + 1);
825	  if (unlikely (offset >= elf->state.ar.long_names_len))
826	    {
827	      /* The index in the long name table is larger than the table.  */
828	      __libelf_seterrno (ELF_E_INVALID_ARCHIVE);
829	      return -1;
830	    }
831	  elf_ar_hdr->ar_name = elf->state.ar.long_names + offset;
832	}
833      else
834	{
835	  /* This is none of the known special entries.  */
836	  __libelf_seterrno (ELF_E_INVALID_ARCHIVE);
837	  return -1;
838	}
839    }
840  else
841    {
842      char *endp;
843
844      /* It is a normal entry.  Copy over the name.  */
845      endp = (char *) memccpy (elf->state.ar.ar_name, ar_hdr->ar_name,
846			       '/', 16);
847      if (endp != NULL)
848	endp[-1] = '\0';
849      else
850	{
851	  /* In the old BSD style of archive, there is no / terminator.
852	     Instead, there is space padding at the end of the name.  */
853	  size_t i = 15;
854	  do
855	    elf->state.ar.ar_name[i] = '\0';
856	  while (i > 0 && elf->state.ar.ar_name[--i] == ' ');
857	}
858
859      elf_ar_hdr->ar_name = elf->state.ar.ar_name;
860    }
861
862  if (unlikely (ar_hdr->ar_size[0] == ' '))
863    /* Something is really wrong.  We cannot live without a size for
864       the member since it will not be possible to find the next
865       archive member.  */
866    {
867      __libelf_seterrno (ELF_E_INVALID_ARCHIVE);
868      return -1;
869    }
870
871  /* Since there are no specialized functions to convert ASCII to
872     time_t, uid_t, gid_t, mode_t, and off_t we use either atol or
873     atoll depending on the size of the types.  We are also prepared
874     for the case where the whole field in the `struct ar_hdr' is
875     filled in which case we cannot simply use atol/l but instead have
876     to create a temporary copy.  */
877
878#define INT_FIELD(FIELD)						      \
879  do									      \
880    {									      \
881      char buf[sizeof (ar_hdr->FIELD) + 1];				      \
882      const char *string = ar_hdr->FIELD;				      \
883      if (ar_hdr->FIELD[sizeof (ar_hdr->FIELD) - 1] != ' ')		      \
884	{								      \
885	  *((char *) __mempcpy (buf, ar_hdr->FIELD, sizeof (ar_hdr->FIELD)))  \
886	    = '\0';							      \
887	  string = buf;							      \
888	}								      \
889      if (sizeof (elf_ar_hdr->FIELD) <= sizeof (long int))		      \
890	elf_ar_hdr->FIELD = (__typeof (elf_ar_hdr->FIELD)) atol (string);     \
891      else								      \
892	elf_ar_hdr->FIELD = (__typeof (elf_ar_hdr->FIELD)) atoll (string);    \
893    }									      \
894  while (0)
895
896  INT_FIELD (ar_date);
897  INT_FIELD (ar_uid);
898  INT_FIELD (ar_gid);
899  INT_FIELD (ar_mode);
900  INT_FIELD (ar_size);
901
902  return 0;
903}
904
905
906/* We were asked to return a clone of an existing descriptor.  This
907   function must be called with the lock on the parent descriptor
908   being held. */
909static Elf *
910dup_elf (int fildes, Elf_Cmd cmd, Elf *ref)
911{
912  struct Elf *result;
913
914  if (fildes == -1)
915    /* Allow the user to pass -1 as the file descriptor for the new file.  */
916    fildes = ref->fildes;
917  /* The file descriptor better should be the same.  If it was disconnected
918     already (using `elf_cntl') we do not test it.  */
919  else if (unlikely (ref->fildes != -1 && fildes != ref->fildes))
920    {
921      __libelf_seterrno (ELF_E_FD_MISMATCH);
922      return NULL;
923    }
924
925  /* The mode must allow reading.  I.e., a descriptor creating with a
926     command different then ELF_C_READ, ELF_C_WRITE and ELF_C_RDWR is
927     not allowed.  */
928  if (unlikely (ref->cmd != ELF_C_READ && ref->cmd != ELF_C_READ_MMAP
929		&& ref->cmd != ELF_C_WRITE && ref->cmd != ELF_C_WRITE_MMAP
930		&& ref->cmd != ELF_C_RDWR && ref->cmd != ELF_C_RDWR_MMAP
931		&& ref->cmd != ELF_C_READ_MMAP_PRIVATE))
932    {
933      __libelf_seterrno (ELF_E_INVALID_OP);
934      return NULL;
935    }
936
937  /* Now it is time to distinguish between reading normal files and
938     archives.  Normal files can easily be handled be incrementing the
939     reference counter and return the same descriptor.  */
940  if (ref->kind != ELF_K_AR)
941    {
942      ++ref->ref_count;
943      return ref;
944    }
945
946  /* This is an archive.  We must create a descriptor for the archive
947     member the internal pointer of the archive file desriptor is
948     pointing to.  First read the header of the next member if this
949     has not happened already.  */
950  if (ref->state.ar.elf_ar_hdr.ar_name == NULL
951      && __libelf_next_arhdr_wrlock (ref) != 0)
952    /* Something went wrong.  Maybe there is no member left.  */
953    return NULL;
954
955  /* We have all the information we need about the next archive member.
956     Now create a descriptor for it.  */
957  result = read_file (fildes, ref->state.ar.offset + sizeof (struct ar_hdr),
958		      ref->state.ar.elf_ar_hdr.ar_size, cmd, ref);
959
960  /* Enlist this new descriptor in the list of children.  */
961  if (result != NULL)
962    {
963      result->next = ref->state.ar.children;
964      ref->state.ar.children = result;
965    }
966
967  return result;
968}
969
970
971/* Return desriptor for empty file ready for writing.  */
972static struct Elf *
973write_file (int fd, Elf_Cmd cmd)
974{
975  /* We simply create an empty `Elf' structure.  */
976#define NSCNSALLOC	10
977  Elf *result = allocate_elf (fd, NULL, 0, 0, cmd, NULL, ELF_K_ELF,
978			      NSCNSALLOC * sizeof (Elf_Scn));
979
980  if (result != NULL)
981    {
982      /* We have to write to the file in any case.  */
983      result->flags = ELF_F_DIRTY;
984
985      /* Some more or less arbitrary value.  */
986      result->state.elf.scnincr = NSCNSALLOC;
987
988      /* We have allocated room for some sections.  */
989      assert (offsetof (struct Elf, state.elf32.scns)
990	      == offsetof (struct Elf, state.elf64.scns));
991      result->state.elf.scns_last = &result->state.elf32.scns;
992      result->state.elf32.scns.max = NSCNSALLOC;
993    }
994
995  return result;
996}
997
998
999/* Return a descriptor for the file belonging to FILDES.  */
1000Elf *
1001elf_begin (fildes, cmd, ref)
1002     int fildes;
1003     Elf_Cmd cmd;
1004     Elf *ref;
1005{
1006  Elf *retval;
1007
1008  if (unlikely (! __libelf_version_initialized))
1009    {
1010      /* Version wasn't set so far.  */
1011      __libelf_seterrno (ELF_E_NO_VERSION);
1012      return NULL;
1013    }
1014
1015  if (ref != NULL)
1016    /* Make sure the descriptor is not suddenly going away.  */
1017    rwlock_rdlock (ref->lock);
1018  else if (unlikely (fcntl (fildes, F_GETFL) == -1 && errno == EBADF))
1019    {
1020      /* We cannot do anything productive without a file descriptor.  */
1021      __libelf_seterrno (ELF_E_INVALID_FILE);
1022      return NULL;
1023    }
1024
1025  Elf *lock_dup_elf ()
1026  {
1027    /* We need wrlock to dup an archive.  */
1028    if (ref->kind == ELF_K_AR)
1029      {
1030	rwlock_unlock (ref->lock);
1031	rwlock_wrlock (ref->lock);
1032      }
1033
1034    /* Duplicate the descriptor.  */
1035    return dup_elf (fildes, cmd, ref);
1036  }
1037
1038  switch (cmd)
1039    {
1040    case ELF_C_NULL:
1041      /* We simply return a NULL pointer.  */
1042      retval = NULL;
1043      break;
1044
1045    case ELF_C_READ_MMAP_PRIVATE:
1046      /* If we have a reference it must also be opened this way.  */
1047      if (unlikely (ref != NULL && ref->cmd != ELF_C_READ_MMAP_PRIVATE))
1048	{
1049	  __libelf_seterrno (ELF_E_INVALID_CMD);
1050	  retval = NULL;
1051	  break;
1052	}
1053      /* FALLTHROUGH */
1054
1055    case ELF_C_READ:
1056    case ELF_C_READ_MMAP:
1057      if (ref != NULL)
1058	retval = lock_dup_elf ();
1059      else
1060	/* Create descriptor for existing file.  */
1061	retval = read_file (fildes, 0, ~((size_t) 0), cmd, NULL);
1062      break;
1063
1064    case ELF_C_RDWR:
1065    case ELF_C_RDWR_MMAP:
1066      /* If we have a REF object it must also be opened using this
1067	 command.  */
1068      if (ref != NULL)
1069	{
1070	  if (unlikely (ref->cmd != ELF_C_RDWR && ref->cmd != ELF_C_RDWR_MMAP
1071			&& ref->cmd != ELF_C_WRITE
1072			&& ref->cmd != ELF_C_WRITE_MMAP))
1073	    {
1074	      /* This is not ok.  REF must also be opened for writing.  */
1075	      __libelf_seterrno (ELF_E_INVALID_CMD);
1076	      retval = NULL;
1077	    }
1078	  else
1079	    retval = lock_dup_elf ();
1080	}
1081      else
1082	/* Create descriptor for existing file.  */
1083	retval = read_file (fildes, 0, ~((size_t) 0), cmd, NULL);
1084      break;
1085
1086    case ELF_C_WRITE:
1087    case ELF_C_WRITE_MMAP:
1088      /* We ignore REF and prepare a descriptor to write a new file.  */
1089      retval = write_file (fildes, cmd);
1090      break;
1091
1092    default:
1093      __libelf_seterrno (ELF_E_INVALID_CMD);
1094      retval = NULL;
1095      break;
1096    }
1097
1098  /* Release the lock.  */
1099  if (ref != NULL)
1100    rwlock_unlock (ref->lock);
1101
1102  return retval;
1103}
1104INTDEF(elf_begin)
1105