1*2de3b87aSKai Wang /*- 2*2de3b87aSKai Wang * Copyright (c) 2006,2008 Joseph Koshy 3*2de3b87aSKai Wang * All rights reserved. 4*2de3b87aSKai Wang * 5*2de3b87aSKai Wang * Redistribution and use in source and binary forms, with or without 6*2de3b87aSKai Wang * modification, are permitted provided that the following conditions 7*2de3b87aSKai Wang * are met: 8*2de3b87aSKai Wang * 1. Redistributions of source code must retain the above copyright 9*2de3b87aSKai Wang * notice, this list of conditions and the following disclaimer. 10*2de3b87aSKai Wang * 2. Redistributions in binary form must reproduce the above copyright 11*2de3b87aSKai Wang * notice, this list of conditions and the following disclaimer in the 12*2de3b87aSKai Wang * documentation and/or other materials provided with the distribution. 13*2de3b87aSKai Wang * 14*2de3b87aSKai Wang * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*2de3b87aSKai Wang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*2de3b87aSKai Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*2de3b87aSKai Wang * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*2de3b87aSKai Wang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*2de3b87aSKai Wang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*2de3b87aSKai Wang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*2de3b87aSKai Wang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*2de3b87aSKai Wang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*2de3b87aSKai Wang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*2de3b87aSKai Wang * SUCH DAMAGE. 25*2de3b87aSKai Wang */ 26*2de3b87aSKai Wang 27*2de3b87aSKai Wang #include <sys/cdefs.h> 28*2de3b87aSKai Wang 29*2de3b87aSKai Wang #include <sys/types.h> 30*2de3b87aSKai Wang 31*2de3b87aSKai Wang #include <libelf.h> 32*2de3b87aSKai Wang 33*2de3b87aSKai Wang #include "_libelf.h" 34*2de3b87aSKai Wang 35*2de3b87aSKai Wang ELFTC_VCSID("$Id: libelf_align.c 2225 2011-11-26 18:55:54Z jkoshy $"); 36*2de3b87aSKai Wang 37*2de3b87aSKai Wang struct align { 38*2de3b87aSKai Wang int a32; 39*2de3b87aSKai Wang int a64; 40*2de3b87aSKai Wang }; 41*2de3b87aSKai Wang 42*2de3b87aSKai Wang #ifdef __GNUC__ 43*2de3b87aSKai Wang #define MALIGN(N) { \ 44*2de3b87aSKai Wang .a32 = __alignof__(Elf32_##N), \ 45*2de3b87aSKai Wang .a64 = __alignof__(Elf64_##N) \ 46*2de3b87aSKai Wang } 47*2de3b87aSKai Wang #define MALIGN64(V) { \ 48*2de3b87aSKai Wang .a32 = 0, \ 49*2de3b87aSKai Wang .a64 = __alignof__(Elf64_##V) \ 50*2de3b87aSKai Wang } 51*2de3b87aSKai Wang #define MALIGN_WORD() { \ 52*2de3b87aSKai Wang .a32 = __alignof__(int32_t), \ 53*2de3b87aSKai Wang .a64 = __alignof__(int64_t) \ 54*2de3b87aSKai Wang } 55*2de3b87aSKai Wang #else 56*2de3b87aSKai Wang #error Need the __alignof__ builtin. 57*2de3b87aSKai Wang #endif 58*2de3b87aSKai Wang #define UNSUPPORTED() { \ 59*2de3b87aSKai Wang .a32 = 0, \ 60*2de3b87aSKai Wang .a64 = 0 \ 61*2de3b87aSKai Wang } 62*2de3b87aSKai Wang 63*2de3b87aSKai Wang static struct align malign[ELF_T_NUM] = { 64*2de3b87aSKai Wang [ELF_T_ADDR] = MALIGN(Addr), 65*2de3b87aSKai Wang [ELF_T_BYTE] = { .a32 = 1, .a64 = 1 }, 66*2de3b87aSKai Wang [ELF_T_CAP] = MALIGN(Cap), 67*2de3b87aSKai Wang [ELF_T_DYN] = MALIGN(Dyn), 68*2de3b87aSKai Wang [ELF_T_EHDR] = MALIGN(Ehdr), 69*2de3b87aSKai Wang [ELF_T_HALF] = MALIGN(Half), 70*2de3b87aSKai Wang [ELF_T_LWORD] = MALIGN(Lword), 71*2de3b87aSKai Wang [ELF_T_MOVE] = MALIGN(Move), 72*2de3b87aSKai Wang [ELF_T_MOVEP] = UNSUPPORTED(), 73*2de3b87aSKai Wang [ELF_T_NOTE] = MALIGN(Nhdr), 74*2de3b87aSKai Wang [ELF_T_OFF] = MALIGN(Off), 75*2de3b87aSKai Wang [ELF_T_PHDR] = MALIGN(Phdr), 76*2de3b87aSKai Wang [ELF_T_REL] = MALIGN(Rel), 77*2de3b87aSKai Wang [ELF_T_RELA] = MALIGN(Rela), 78*2de3b87aSKai Wang [ELF_T_SHDR] = MALIGN(Shdr), 79*2de3b87aSKai Wang [ELF_T_SWORD] = MALIGN(Sword), 80*2de3b87aSKai Wang [ELF_T_SXWORD] = MALIGN64(Sxword), 81*2de3b87aSKai Wang [ELF_T_SYM] = MALIGN(Sym), 82*2de3b87aSKai Wang [ELF_T_SYMINFO] = MALIGN(Syminfo), 83*2de3b87aSKai Wang [ELF_T_VDEF] = MALIGN(Verdef), 84*2de3b87aSKai Wang [ELF_T_VNEED] = MALIGN(Verneed), 85*2de3b87aSKai Wang [ELF_T_WORD] = MALIGN(Word), 86*2de3b87aSKai Wang [ELF_T_XWORD] = MALIGN64(Xword), 87*2de3b87aSKai Wang [ELF_T_GNUHASH] = MALIGN_WORD() 88*2de3b87aSKai Wang }; 89*2de3b87aSKai Wang 90*2de3b87aSKai Wang int 91*2de3b87aSKai Wang _libelf_malign(Elf_Type t, int elfclass) 92*2de3b87aSKai Wang { 93*2de3b87aSKai Wang if (t >= ELF_T_NUM || (int) t < 0) 94*2de3b87aSKai Wang return (0); 95*2de3b87aSKai Wang 96*2de3b87aSKai Wang return (elfclass == ELFCLASS32 ? malign[t].a32 : 97*2de3b87aSKai Wang malign[t].a64); 98*2de3b87aSKai Wang } 99*2de3b87aSKai Wang 100*2de3b87aSKai Wang #define FALIGN(A32,A64) { .a32 = (A32), .a64 = (A64) } 101*2de3b87aSKai Wang 102*2de3b87aSKai Wang static struct align falign[ELF_T_NUM] = { 103*2de3b87aSKai Wang [ELF_T_ADDR] = FALIGN(4,8), 104*2de3b87aSKai Wang [ELF_T_BYTE] = FALIGN(1,1), 105*2de3b87aSKai Wang [ELF_T_CAP] = FALIGN(4,8), 106*2de3b87aSKai Wang [ELF_T_DYN] = FALIGN(4,8), 107*2de3b87aSKai Wang [ELF_T_EHDR] = FALIGN(4,8), 108*2de3b87aSKai Wang [ELF_T_HALF] = FALIGN(2,2), 109*2de3b87aSKai Wang [ELF_T_LWORD] = FALIGN(8,8), 110*2de3b87aSKai Wang [ELF_T_MOVE] = FALIGN(8,8), 111*2de3b87aSKai Wang [ELF_T_MOVEP] = UNSUPPORTED(), 112*2de3b87aSKai Wang [ELF_T_NOTE] = FALIGN(4,4), 113*2de3b87aSKai Wang [ELF_T_OFF] = FALIGN(4,8), 114*2de3b87aSKai Wang [ELF_T_PHDR] = FALIGN(4,8), 115*2de3b87aSKai Wang [ELF_T_REL] = FALIGN(4,8), 116*2de3b87aSKai Wang [ELF_T_RELA] = FALIGN(4,8), 117*2de3b87aSKai Wang [ELF_T_SHDR] = FALIGN(4,8), 118*2de3b87aSKai Wang [ELF_T_SWORD] = FALIGN(4,4), 119*2de3b87aSKai Wang [ELF_T_SXWORD] = FALIGN(0,8), 120*2de3b87aSKai Wang [ELF_T_SYM] = FALIGN(4,8), 121*2de3b87aSKai Wang [ELF_T_SYMINFO] = FALIGN(2,2), 122*2de3b87aSKai Wang [ELF_T_VDEF] = FALIGN(4,4), 123*2de3b87aSKai Wang [ELF_T_VNEED] = FALIGN(4,4), 124*2de3b87aSKai Wang [ELF_T_WORD] = FALIGN(4,4), 125*2de3b87aSKai Wang [ELF_T_XWORD] = FALIGN(0,8), 126*2de3b87aSKai Wang [ELF_T_GNUHASH] = FALIGN(4,8) 127*2de3b87aSKai Wang }; 128*2de3b87aSKai Wang 129*2de3b87aSKai Wang int 130*2de3b87aSKai Wang _libelf_falign(Elf_Type t, int elfclass) 131*2de3b87aSKai Wang { 132*2de3b87aSKai Wang if (t >= ELF_T_NUM || (int) t < 0) 133*2de3b87aSKai Wang return (0); 134*2de3b87aSKai Wang 135*2de3b87aSKai Wang return (elfclass == ELFCLASS32 ? falign[t].a32 : 136*2de3b87aSKai Wang falign[t].a64); 137*2de3b87aSKai Wang } 138