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