xref: /openbsd-src/lib/libelf/libelf_data.c (revision 63b9365298cb9b8f7a9d67494526f438709cd72a)
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