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