author | Gareth Stockwell <gareth.stockwell@accenture.com> |
Mon, 06 Sep 2010 16:25:43 +0100 | |
changeset 106 | 3bc1a978be44 |
parent 34 | 92d87f2e53c2 |
permissions | -rwxr-xr-x |
34
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
1 |
/* |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
2 |
* getarsym.c - implementation of the elf_getarsym(3) function. |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
3 |
* Copyright (C) 1995 - 1998, 2004 Michael Riepe |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
4 |
* |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
5 |
* This library is free software; you can redistribute it and/or |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
6 |
* modify it under the terms of the GNU Library General Public |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
7 |
* License as published by the Free Software Foundation; either |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
8 |
* version 2 of the License, or (at your option) any later version. |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
9 |
* |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
10 |
* This library is distributed in the hope that it will be useful, |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
11 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
12 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
13 |
* Library General Public License for more details. |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
14 |
* |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
15 |
* You should have received a copy of the GNU Library General Public |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
16 |
* License along with this library; if not, write to the Free Software |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
17 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
18 |
*/ |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
19 |
|
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
20 |
#include <private.h> |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
21 |
#include <byteswap.h> |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
22 |
|
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
23 |
#ifndef lint |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
24 |
static const char rcsid[] = "@(#) $Id: getarsym.c,v 1.8 2005/05/21 15:39:23 michael Exp $"; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
25 |
#endif /* lint */ |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
26 |
|
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
27 |
Elf_Arsym* |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
28 |
elf_getarsym(Elf *elf, size_t *ptr) { |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
29 |
Elf_Arsym *syms; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
30 |
size_t count; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
31 |
size_t tmp; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
32 |
size_t i; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
33 |
char *s; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
34 |
char *e; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
35 |
|
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
36 |
if (!ptr) { |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
37 |
ptr = &tmp; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
38 |
} |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
39 |
*ptr = 0; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
40 |
if (!elf) { |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
41 |
return NULL; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
42 |
} |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
43 |
elf_assert(elf->e_magic == ELF_MAGIC); |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
44 |
if (elf->e_kind != ELF_K_AR) { |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
45 |
seterr(ERROR_NOTARCHIVE); |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
46 |
return NULL; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
47 |
} |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
48 |
if (elf->e_symtab && !elf->e_free_syms) { |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
49 |
if (elf->e_symlen < 4) { |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
50 |
seterr(ERROR_SIZE_ARSYMTAB); |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
51 |
return NULL; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
52 |
} |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
53 |
count = __load_u32M(elf->e_symtab); |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
54 |
if (elf->e_symlen < 4 * (count + 1)) { |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
55 |
seterr(ERROR_SIZE_ARSYMTAB); |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
56 |
return NULL; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
57 |
} |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
58 |
if (!(syms = (Elf_Arsym*)malloc((count + 1) * sizeof(*syms)))) { |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
59 |
seterr(ERROR_MEM_ARSYMTAB); |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
60 |
return NULL; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
61 |
} |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
62 |
s = elf->e_symtab + 4 * (count + 1); |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
63 |
e = elf->e_symtab + elf->e_symlen; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
64 |
for (i = 0; i < count; i++, s++) { |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
65 |
syms[i].as_name = s; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
66 |
while (s < e && *s) { |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
67 |
s++; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
68 |
} |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
69 |
if (s >= e) { |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
70 |
seterr(ERROR_SIZE_ARSYMTAB); |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
71 |
free(syms); |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
72 |
return NULL; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
73 |
} |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
74 |
elf_assert(!*s); |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
75 |
syms[i].as_hash = elf_hash((unsigned char*)syms[i].as_name); |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
76 |
syms[i].as_off = __load_u32M(elf->e_symtab + 4 * (i + 1)); |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
77 |
} |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
78 |
syms[count].as_name = NULL; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
79 |
syms[count].as_hash = ~0UL; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
80 |
syms[count].as_off = 0; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
81 |
elf->e_symtab = (char*)syms; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
82 |
elf->e_symlen = count + 1; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
83 |
elf->e_free_syms = 1; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
84 |
} |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
85 |
*ptr = elf->e_symlen; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
86 |
return (Elf_Arsym*)elf->e_symtab; |
92d87f2e53c2
Added ELF4ROM and e32test-driver
Martin Trojer <martin.trojer@nokia.com>
parents:
diff
changeset
|
87 |
} |