Line data Source code
1 : /* Return number of sections in the ELF file.
2 : Copyright (C) 2002, 2009, 2015 Red Hat, Inc.
3 : This file is part of elfutils.
4 : Written by Ulrich Drepper <drepper@redhat.com>, 2002.
5 :
6 : This file is free software; you can redistribute it and/or modify
7 : it under the terms of either
8 :
9 : * the GNU Lesser General Public License as published by the Free
10 : Software Foundation; either version 3 of the License, or (at
11 : your option) any later version
12 :
13 : or
14 :
15 : * the GNU General Public License as published by the Free
16 : Software Foundation; either version 2 of the License, or (at
17 : your option) any later version
18 :
19 : or both in parallel, as here.
20 :
21 : elfutils is distributed in the hope that it will be useful, but
22 : WITHOUT ANY WARRANTY; without even the implied warranty of
23 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 : General Public License for more details.
25 :
26 : You should have received copies of the GNU General Public License and
27 : the GNU Lesser General Public License along with this program. If
28 : not, see <http://www.gnu.org/licenses/>. */
29 :
30 : #ifdef HAVE_CONFIG_H
31 : # include <config.h>
32 : #endif
33 :
34 : #include <assert.h>
35 : #include <gelf.h>
36 : #include <stddef.h>
37 :
38 : #include "libelfP.h"
39 :
40 :
41 : int
42 : internal_function
43 2166 : __elf_getshdrnum_rdlock (Elf *elf, size_t *dst)
44 : {
45 2166 : int result = 0;
46 : int idx;
47 :
48 2166 : if (elf == NULL)
49 : return -1;
50 :
51 2166 : if (unlikely (elf->kind != ELF_K_ELF))
52 : {
53 0 : __libelf_seterrno (ELF_E_INVALID_HANDLE);
54 0 : return -1;
55 : }
56 :
57 2166 : idx = elf->state.elf.scns_last->cnt;
58 2166 : if (idx != 0
59 17 : || (elf->state.elf.scns_last
60 : != (elf->class == ELFCLASS32
61 : || (offsetof (Elf, state.elf32.scns)
62 : == offsetof (Elf, state.elf64.scns))
63 17 : ? &elf->state.elf32.scns : &elf->state.elf64.scns)))
64 : /* There is at least one section. */
65 2149 : *dst = 1 + elf->state.elf.scns_last->data[idx - 1].index;
66 : else
67 17 : *dst = 0;
68 :
69 : return result;
70 : }
71 :
72 : int
73 1092 : elf_getshdrnum (Elf *elf, size_t *dst)
74 : {
75 : int result;
76 :
77 1092 : if (elf == NULL)
78 : return -1;
79 :
80 : rwlock_rdlock (elf->lock);
81 1092 : result = __elf_getshdrnum_rdlock (elf, dst);
82 : rwlock_unlock (elf->lock);
83 :
84 1092 : return result;
85 : }
86 : /* Alias for the deprecated name. */
87 : strong_alias (elf_getshdrnum, elf_getshnum)
|