1a1b5ec25Sjsg /*-
2a1b5ec25Sjsg * Copyright (c) 2006,2008 Joseph Koshy
3a1b5ec25Sjsg * All rights reserved.
4a1b5ec25Sjsg *
5a1b5ec25Sjsg * Redistribution and use in source and binary forms, with or without
6a1b5ec25Sjsg * modification, are permitted provided that the following conditions
7a1b5ec25Sjsg * are met:
8a1b5ec25Sjsg * 1. Redistributions of source code must retain the above copyright
9a1b5ec25Sjsg * notice, this list of conditions and the following disclaimer.
10a1b5ec25Sjsg * 2. Redistributions in binary form must reproduce the above copyright
11a1b5ec25Sjsg * notice, this list of conditions and the following disclaimer in the
12a1b5ec25Sjsg * documentation and/or other materials provided with the distribution.
13a1b5ec25Sjsg *
14a1b5ec25Sjsg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15a1b5ec25Sjsg * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16a1b5ec25Sjsg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17a1b5ec25Sjsg * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18a1b5ec25Sjsg * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19a1b5ec25Sjsg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20a1b5ec25Sjsg * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21a1b5ec25Sjsg * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22a1b5ec25Sjsg * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23a1b5ec25Sjsg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24a1b5ec25Sjsg * SUCH DAMAGE.
25a1b5ec25Sjsg */
26a1b5ec25Sjsg
27a1b5ec25Sjsg #include <libelf.h>
28a1b5ec25Sjsg
29a1b5ec25Sjsg #include "_libelf.h"
30a1b5ec25Sjsg
31*63b93652Sjsg ELFTC_VCSID("$Id: libelf_data.c,v 1.2 2020/05/18 06:46:23 jsg Exp $");
32a1b5ec25Sjsg
33a1b5ec25Sjsg int
_libelf_xlate_shtype(uint32_t sht)34a1b5ec25Sjsg _libelf_xlate_shtype(uint32_t sht)
35a1b5ec25Sjsg {
36a1b5ec25Sjsg /*
37a1b5ec25Sjsg * Look for known section types.
38a1b5ec25Sjsg */
39a1b5ec25Sjsg switch (sht) {
40a1b5ec25Sjsg case SHT_DYNAMIC:
41a1b5ec25Sjsg return (ELF_T_DYN);
42a1b5ec25Sjsg case SHT_DYNSYM:
43a1b5ec25Sjsg return (ELF_T_SYM);
44a1b5ec25Sjsg case SHT_FINI_ARRAY:
45a1b5ec25Sjsg return (ELF_T_ADDR);
46a1b5ec25Sjsg case SHT_GNU_HASH:
47a1b5ec25Sjsg return (ELF_T_GNUHASH);
48a1b5ec25Sjsg case SHT_GNU_LIBLIST:
49a1b5ec25Sjsg return (ELF_T_WORD);
50a1b5ec25Sjsg case SHT_GROUP:
51a1b5ec25Sjsg return (ELF_T_WORD);
52a1b5ec25Sjsg case SHT_HASH:
53a1b5ec25Sjsg return (ELF_T_WORD);
54a1b5ec25Sjsg case SHT_INIT_ARRAY:
55a1b5ec25Sjsg return (ELF_T_ADDR);
56a1b5ec25Sjsg case SHT_NOBITS:
57a1b5ec25Sjsg return (ELF_T_BYTE);
58a1b5ec25Sjsg case SHT_NOTE:
59a1b5ec25Sjsg return (ELF_T_NOTE);
60a1b5ec25Sjsg case SHT_PREINIT_ARRAY:
61a1b5ec25Sjsg return (ELF_T_ADDR);
62a1b5ec25Sjsg case SHT_PROGBITS:
63a1b5ec25Sjsg return (ELF_T_BYTE);
64a1b5ec25Sjsg case SHT_REL:
65a1b5ec25Sjsg return (ELF_T_REL);
66a1b5ec25Sjsg case SHT_RELA:
67a1b5ec25Sjsg return (ELF_T_RELA);
68a1b5ec25Sjsg case SHT_STRTAB:
69a1b5ec25Sjsg return (ELF_T_BYTE);
70a1b5ec25Sjsg case SHT_SYMTAB:
71a1b5ec25Sjsg return (ELF_T_SYM);
72a1b5ec25Sjsg case SHT_SYMTAB_SHNDX:
73a1b5ec25Sjsg return (ELF_T_WORD);
74a1b5ec25Sjsg case SHT_SUNW_dof:
75a1b5ec25Sjsg return (ELF_T_BYTE);
76a1b5ec25Sjsg case SHT_SUNW_move:
77a1b5ec25Sjsg return (ELF_T_MOVE);
78a1b5ec25Sjsg case SHT_SUNW_syminfo:
79a1b5ec25Sjsg return (ELF_T_SYMINFO);
80a1b5ec25Sjsg case SHT_SUNW_verdef: /* == SHT_GNU_verdef */
81a1b5ec25Sjsg return (ELF_T_VDEF);
82a1b5ec25Sjsg case SHT_SUNW_verneed: /* == SHT_GNU_verneed */
83a1b5ec25Sjsg return (ELF_T_VNEED);
84a1b5ec25Sjsg case SHT_SUNW_versym: /* == SHT_GNU_versym */
85a1b5ec25Sjsg return (ELF_T_HALF);
86a1b5ec25Sjsg default:
87a1b5ec25Sjsg /*
88a1b5ec25Sjsg * Values in the range [SHT_LOOS..SHT_HIUSER] (i.e.,
89a1b5ec25Sjsg * OS, processor and user-defined section types) are
90a1b5ec25Sjsg * legal, but since we do not know anything more about
91a1b5ec25Sjsg * their semantics, we return a type of ELF_T_BYTE.
92*63b93652Sjsg *
93*63b93652Sjsg * The ELF specification uses 32 bit unsigned values for
94*63b93652Sjsg * denoting section types, and defines SHT_HIUSER to be
95*63b93652Sjsg * 0xFFFFFFFFUL (i.e., UINT32_MAX). Consequently, we only
96*63b93652Sjsg * need to check that 'sht' is greater than or equal to
97*63b93652Sjsg * SHT_LOOS.
98a1b5ec25Sjsg */
99*63b93652Sjsg if (sht >= SHT_LOOS)
100a1b5ec25Sjsg return (ELF_T_BYTE);
101a1b5ec25Sjsg
102a1b5ec25Sjsg /*
103a1b5ec25Sjsg * Other values are unsupported.
104a1b5ec25Sjsg */
105a1b5ec25Sjsg return (-1);
106a1b5ec25Sjsg }
107a1b5ec25Sjsg }
108