libelf_align.c revision 179240
1231200Smm/*- 2231200Smm * Copyright (c) 2006 Joseph Koshy 3231200Smm * All rights reserved. 4231200Smm * 5231200Smm * Redistribution and use in source and binary forms, with or without 6231200Smm * modification, are permitted provided that the following conditions 7231200Smm * are met: 8231200Smm * 1. Redistributions of source code must retain the above copyright 9231200Smm * notice, this list of conditions and the following disclaimer. 10231200Smm * 2. Redistributions in binary form must reproduce the above copyright 11231200Smm * notice, this list of conditions and the following disclaimer in the 12231200Smm * documentation and/or other materials provided with the distribution. 13231200Smm * 14231200Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15231200Smm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16231200Smm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17231200Smm * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18231200Smm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19231200Smm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20231200Smm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21231200Smm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22231200Smm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23231200Smm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24231200Smm * SUCH DAMAGE. 25231200Smm */ 26231200Smm 27302001Smm#include <sys/cdefs.h> 28231200Smm__FBSDID("$FreeBSD: head/lib/libelf/libelf_align.c 179240 2008-05-23 07:33:45Z jb $"); 29231200Smm 30231200Smm#include <sys/types.h> 31302001Smm 32302001Smm#include <machine/elf.h> 33302001Smm#include <machine/endian.h> 34302001Smm 35302001Smm#include <libelf.h> 36302001Smm#include <osreldate.h> 37231200Smm 38302001Smm#include "_libelf.h" 39302001Smm 40302001Smmstruct align { 41302001Smm int a32; 42302001Smm int a64; 43302001Smm}; 44302001Smm 45302001Smm#ifdef __GNUC__ 46231200Smm#define MALIGN(N) { \ 47231200Smm .a32 = __alignof__(Elf32_##N), \ 48302001Smm .a64 = __alignof__(Elf64_##N) \ 49231200Smm } 50231200Smm#define MALIGN64(V) { \ 51302001Smm .a32 = 0, \ 52302001Smm .a64 = __alignof__(Elf64_##V) \ 53302001Smm } 54302001Smm#else 55353377Smm#error Need the __alignof__ builtin. 56231200Smm#endif 57238856Smm#define UNSUPPORTED() { \ 58238856Smm .a32 = 0, \ 59231200Smm .a64 = 0 \ 60231200Smm } 61231200Smm 62302001Smmstatic struct align malign[ELF_T_NUM] = { 63302001Smm [ELF_T_ADDR] = MALIGN(Addr), 64302001Smm [ELF_T_BYTE] = { .a32 = 1, .a64 = 1 }, 65302001Smm#if __FreeBSD_version >= 700025 66302001Smm [ELF_T_CAP] = MALIGN(Cap), 67302001Smm#endif 68302001Smm [ELF_T_DYN] = MALIGN(Dyn), 69302001Smm [ELF_T_EHDR] = MALIGN(Ehdr), 70302001Smm [ELF_T_HALF] = MALIGN(Half), 71302001Smm#if __FreeBSD_version >= 700025 72302001Smm [ELF_T_LWORD] = MALIGN(Lword), 73302001Smm [ELF_T_MOVE] = MALIGN(Move), 74231200Smm#endif 75231200Smm [ELF_T_MOVEP] = UNSUPPORTED(), 76302001Smm#if __FreeBSD_version >= 700025 77302001Smm [ELF_T_NOTE] = MALIGN(Nhdr), 78302001Smm#endif 79302001Smm [ELF_T_OFF] = MALIGN(Off), 80302001Smm [ELF_T_PHDR] = MALIGN(Phdr), 81302001Smm [ELF_T_REL] = MALIGN(Rel), 82302001Smm [ELF_T_RELA] = MALIGN(Rela), 83302001Smm [ELF_T_SHDR] = MALIGN(Shdr), 84302001Smm [ELF_T_SWORD] = MALIGN(Sword), 85302001Smm [ELF_T_SXWORD] = MALIGN64(Sxword), 86302001Smm [ELF_T_SYM] = MALIGN(Sym), 87302001Smm#if __FreeBSD_version >= 700025 88231200Smm [ELF_T_SYMINFO] = MALIGN(Syminfo), 89231200Smm#endif 90231200Smm#if __FreeBSD_version >= 700009 91231200Smm [ELF_T_VDEF] = MALIGN(Verdef), 92302001Smm [ELF_T_VNEED] = MALIGN(Verneed), 93302001Smm#endif 94231200Smm [ELF_T_WORD] = MALIGN(Word), 95231200Smm [ELF_T_XWORD] = MALIGN64(Xword) 96231200Smm}; 97231200Smm 98231200Smmint 99302001Smm_libelf_malign(Elf_Type t, int elfclass) 100302001Smm{ 101302001Smm if (t >= ELF_T_NUM || (int) t < 0) 102302001Smm return (0); 103302001Smm 104302001Smm return (elfclass == ELFCLASS32 ? malign[t].a32 : 105302001Smm malign[t].a64); 106302001Smm} 107231200Smm 108231200Smm#define FALIGN(A32,A64) { .a32 = (A32), .a64 = (A64) } 109231200Smm 110302001Smmstatic struct align falign[ELF_T_NUM] = { 111302001Smm [ELF_T_ADDR] = FALIGN(4,8), 112302001Smm [ELF_T_BYTE] = FALIGN(1,1), 113302001Smm#if __FreeBSD_version >= 700025 114302001Smm [ELF_T_CAP] = FALIGN(4,8), 115302001Smm#endif 116302001Smm [ELF_T_DYN] = FALIGN(4,8), 117302001Smm [ELF_T_EHDR] = FALIGN(4,8), 118302001Smm [ELF_T_HALF] = FALIGN(2,2), 119302001Smm#if __FreeBSD_version >= 700025 120302001Smm [ELF_T_LWORD] = FALIGN(8,8), 121302001Smm [ELF_T_MOVE] = FALIGN(8,8), 122302001Smm#endif 123302001Smm [ELF_T_MOVEP] = UNSUPPORTED(), 124302001Smm#if __FreeBSD_version >= 700025 125302001Smm [ELF_T_NOTE] = FALIGN(1,1), 126302001Smm#endif 127302001Smm [ELF_T_OFF] = FALIGN(4,8), 128302001Smm [ELF_T_PHDR] = FALIGN(4,8), 129302001Smm [ELF_T_REL] = FALIGN(4,8), 130302001Smm [ELF_T_RELA] = FALIGN(4,8), 131302001Smm [ELF_T_SHDR] = FALIGN(4,8), 132302001Smm [ELF_T_SWORD] = FALIGN(4,4), 133302001Smm [ELF_T_SXWORD] = FALIGN(0,8), 134302001Smm [ELF_T_SYM] = FALIGN(4,8), 135302001Smm#if __FreeBSD_version >= 700025 136302001Smm [ELF_T_SYMINFO] = FALIGN(2,2), 137302001Smm#endif 138302001Smm#if __FreeBSD_version >= 700009 139302001Smm [ELF_T_VDEF] = FALIGN(4,4), 140302001Smm [ELF_T_VNEED] = FALIGN(4,4), 141302001Smm#endif 142302001Smm [ELF_T_WORD] = FALIGN(4,4), 143302001Smm [ELF_T_XWORD] = FALIGN(0,8) 144302001Smm}; 145302001Smm 146302001Smmint 147302001Smm_libelf_falign(Elf_Type t, int elfclass) 148302001Smm{ 149302001Smm if (t >= ELF_T_NUM || (int) t < 0) 150302001Smm return (0); 151302001Smm 152302001Smm return (elfclass == ELFCLASS32 ? falign[t].a32 : 153231200Smm falign[t].a64); 154231200Smm} 155231200Smm