libelf_align.c revision 4484
14484Sbinkertn@umich.edu/*- 24484Sbinkertn@umich.edu * Copyright (c) 2006 Joseph Koshy 34484Sbinkertn@umich.edu * All rights reserved. 44484Sbinkertn@umich.edu * 54484Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without 64484Sbinkertn@umich.edu * modification, are permitted provided that the following conditions 74484Sbinkertn@umich.edu * are met: 84484Sbinkertn@umich.edu * 1. Redistributions of source code must retain the above copyright 94484Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer. 104484Sbinkertn@umich.edu * 2. Redistributions in binary form must reproduce the above copyright 114484Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer in the 124484Sbinkertn@umich.edu * documentation and/or other materials provided with the distribution. 134484Sbinkertn@umich.edu * 144484Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 154484Sbinkertn@umich.edu * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 164484Sbinkertn@umich.edu * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 174484Sbinkertn@umich.edu * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 184484Sbinkertn@umich.edu * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 194484Sbinkertn@umich.edu * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 204484Sbinkertn@umich.edu * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 214484Sbinkertn@umich.edu * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 224484Sbinkertn@umich.edu * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 234484Sbinkertn@umich.edu * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 244484Sbinkertn@umich.edu * SUCH DAMAGE. 254484Sbinkertn@umich.edu */ 264484Sbinkertn@umich.edu 274484Sbinkertn@umich.edu#include <sys/types.h> 284484Sbinkertn@umich.edu 294484Sbinkertn@umich.edu//#include <machine/elf.h> 304484Sbinkertn@umich.edu//#include <machine/endian.h> 314484Sbinkertn@umich.edu 324484Sbinkertn@umich.edu#include "libelf.h" 334484Sbinkertn@umich.edu 344484Sbinkertn@umich.edu#include "_libelf.h" 354484Sbinkertn@umich.edu 364484Sbinkertn@umich.edustruct align { 374484Sbinkertn@umich.edu int a32; 384484Sbinkertn@umich.edu int a64; 394484Sbinkertn@umich.edu}; 404484Sbinkertn@umich.edu 414484Sbinkertn@umich.edu#ifdef __GNUC__ 424484Sbinkertn@umich.edu#define MALIGN(N) { \ 434484Sbinkertn@umich.edu .a32 = __alignof__(Elf32_##N), \ 444484Sbinkertn@umich.edu .a64 = __alignof__(Elf64_##N) \ 454484Sbinkertn@umich.edu } 464484Sbinkertn@umich.edu#define MALIGN64(V) { \ 474484Sbinkertn@umich.edu .a32 = 0, \ 484484Sbinkertn@umich.edu .a64 = __alignof__(Elf64_##V) \ 494484Sbinkertn@umich.edu } 504484Sbinkertn@umich.edu#else 514484Sbinkertn@umich.edu#error Need the __alignof__ builtin. 524484Sbinkertn@umich.edu#endif 534484Sbinkertn@umich.edu#define UNSUPPORTED() { \ 544484Sbinkertn@umich.edu .a32 = 0, \ 554484Sbinkertn@umich.edu .a64 = 0 \ 564484Sbinkertn@umich.edu } 574484Sbinkertn@umich.edu 584484Sbinkertn@umich.edustatic struct align malign[ELF_T_NUM] = { 594484Sbinkertn@umich.edu [ELF_T_ADDR] = MALIGN(Addr), 604484Sbinkertn@umich.edu [ELF_T_BYTE] = { .a32 = 1, .a64 = 1 }, 614484Sbinkertn@umich.edu [ELF_T_CAP] = MALIGN(Cap), 624484Sbinkertn@umich.edu [ELF_T_DYN] = MALIGN(Dyn), 634484Sbinkertn@umich.edu [ELF_T_EHDR] = MALIGN(Ehdr), 644484Sbinkertn@umich.edu [ELF_T_HALF] = MALIGN(Half), 654484Sbinkertn@umich.edu [ELF_T_LWORD] = MALIGN(Lword), 664484Sbinkertn@umich.edu [ELF_T_MOVE] = MALIGN(Move), 674484Sbinkertn@umich.edu [ELF_T_MOVEP] = UNSUPPORTED(), 684484Sbinkertn@umich.edu [ELF_T_NOTE] = MALIGN(Nhdr), 694484Sbinkertn@umich.edu [ELF_T_OFF] = MALIGN(Off), 704484Sbinkertn@umich.edu [ELF_T_PHDR] = MALIGN(Phdr), 714484Sbinkertn@umich.edu [ELF_T_REL] = MALIGN(Rel), 724484Sbinkertn@umich.edu [ELF_T_RELA] = MALIGN(Rela), 734484Sbinkertn@umich.edu [ELF_T_SHDR] = MALIGN(Shdr), 744484Sbinkertn@umich.edu [ELF_T_SWORD] = MALIGN(Sword), 754484Sbinkertn@umich.edu [ELF_T_SXWORD] = MALIGN64(Sxword), 764484Sbinkertn@umich.edu [ELF_T_SYM] = MALIGN(Sym), 774484Sbinkertn@umich.edu [ELF_T_SYMINFO] = MALIGN(Syminfo), 784484Sbinkertn@umich.edu [ELF_T_VDEF] = MALIGN(Verdef), 794484Sbinkertn@umich.edu [ELF_T_VNEED] = MALIGN(Verneed), 804484Sbinkertn@umich.edu [ELF_T_WORD] = MALIGN(Word), 814484Sbinkertn@umich.edu [ELF_T_XWORD] = MALIGN64(Xword) 824484Sbinkertn@umich.edu}; 834484Sbinkertn@umich.edu 844484Sbinkertn@umich.eduint 854484Sbinkertn@umich.edu_libelf_malign(Elf_Type t, int elfclass) 864484Sbinkertn@umich.edu{ 874484Sbinkertn@umich.edu if (t >= ELF_T_NUM || (int) t < 0) 884484Sbinkertn@umich.edu return (0); 894484Sbinkertn@umich.edu 904484Sbinkertn@umich.edu return (elfclass == ELFCLASS32 ? malign[t].a32 : 914484Sbinkertn@umich.edu malign[t].a64); 924484Sbinkertn@umich.edu} 934484Sbinkertn@umich.edu 944484Sbinkertn@umich.edu#define FALIGN(A32,A64) { .a32 = (A32), .a64 = (A64) } 954484Sbinkertn@umich.edu 964484Sbinkertn@umich.edustatic struct align falign[ELF_T_NUM] = { 974484Sbinkertn@umich.edu [ELF_T_ADDR] = FALIGN(4,8), 984484Sbinkertn@umich.edu [ELF_T_BYTE] = FALIGN(1,1), 994484Sbinkertn@umich.edu [ELF_T_CAP] = FALIGN(4,8), 1004484Sbinkertn@umich.edu [ELF_T_DYN] = FALIGN(4,8), 1014484Sbinkertn@umich.edu [ELF_T_EHDR] = FALIGN(4,8), 1024484Sbinkertn@umich.edu [ELF_T_HALF] = FALIGN(2,2), 1034484Sbinkertn@umich.edu [ELF_T_LWORD] = FALIGN(8,8), 1044484Sbinkertn@umich.edu [ELF_T_MOVE] = FALIGN(8,8), 1054484Sbinkertn@umich.edu [ELF_T_MOVEP] = UNSUPPORTED(), 1064484Sbinkertn@umich.edu [ELF_T_NOTE] = FALIGN(4,4), 1074484Sbinkertn@umich.edu [ELF_T_OFF] = FALIGN(4,8), 1084484Sbinkertn@umich.edu [ELF_T_PHDR] = FALIGN(4,8), 1094484Sbinkertn@umich.edu [ELF_T_REL] = FALIGN(4,8), 1104484Sbinkertn@umich.edu [ELF_T_RELA] = FALIGN(4,8), 1114484Sbinkertn@umich.edu [ELF_T_SHDR] = FALIGN(4,8), 1124484Sbinkertn@umich.edu [ELF_T_SWORD] = FALIGN(4,4), 1134484Sbinkertn@umich.edu [ELF_T_SXWORD] = FALIGN(0,8), 1144484Sbinkertn@umich.edu [ELF_T_SYM] = FALIGN(4,8), 1154484Sbinkertn@umich.edu [ELF_T_SYMINFO] = FALIGN(2,2), 1164484Sbinkertn@umich.edu [ELF_T_VDEF] = FALIGN(4,4), 1174484Sbinkertn@umich.edu [ELF_T_VNEED] = FALIGN(4,4), 1184484Sbinkertn@umich.edu [ELF_T_WORD] = FALIGN(4,4), 1194484Sbinkertn@umich.edu [ELF_T_XWORD] = FALIGN(0,8) 1204484Sbinkertn@umich.edu}; 1214484Sbinkertn@umich.edu 1224484Sbinkertn@umich.eduint 1234484Sbinkertn@umich.edu_libelf_falign(Elf_Type t, int elfclass) 1244484Sbinkertn@umich.edu{ 1254484Sbinkertn@umich.edu if (t >= ELF_T_NUM || (int) t < 0) 1264484Sbinkertn@umich.edu return (0); 1274484Sbinkertn@umich.edu 1284484Sbinkertn@umich.edu return (elfclass == ELFCLASS32 ? falign[t].a32 : 1294484Sbinkertn@umich.edu falign[t].a64); 1304484Sbinkertn@umich.edu} 131