12de3b87aSKai Wang /*- 22de3b87aSKai Wang * Copyright (c) 2006,2008 Joseph Koshy 32de3b87aSKai Wang * All rights reserved. 42de3b87aSKai Wang * 52de3b87aSKai Wang * Redistribution and use in source and binary forms, with or without 62de3b87aSKai Wang * modification, are permitted provided that the following conditions 72de3b87aSKai Wang * are met: 82de3b87aSKai Wang * 1. Redistributions of source code must retain the above copyright 92de3b87aSKai Wang * notice, this list of conditions and the following disclaimer. 102de3b87aSKai Wang * 2. Redistributions in binary form must reproduce the above copyright 112de3b87aSKai Wang * notice, this list of conditions and the following disclaimer in the 122de3b87aSKai Wang * documentation and/or other materials provided with the distribution. 132de3b87aSKai Wang * 142de3b87aSKai Wang * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 152de3b87aSKai Wang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 162de3b87aSKai Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 172de3b87aSKai Wang * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 182de3b87aSKai Wang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 192de3b87aSKai Wang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 202de3b87aSKai Wang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 212de3b87aSKai Wang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 222de3b87aSKai Wang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 232de3b87aSKai Wang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 242de3b87aSKai Wang * SUCH DAMAGE. 252de3b87aSKai Wang */ 262de3b87aSKai Wang 272de3b87aSKai Wang #include <sys/cdefs.h> 282de3b87aSKai Wang 292de3b87aSKai Wang #include <assert.h> 302de3b87aSKai Wang #include <gelf.h> 312de3b87aSKai Wang #include <libelf.h> 322de3b87aSKai Wang #include <limits.h> 33*b4e9f239SEd Maste #include <stdint.h> 342de3b87aSKai Wang 352de3b87aSKai Wang #include "_libelf.h" 362de3b87aSKai Wang 372de3b87aSKai Wang ELFTC_VCSID("$Id: gelf_shdr.c 2268 2011-12-03 17:05:11Z jkoshy $"); 382de3b87aSKai Wang 392de3b87aSKai Wang Elf32_Shdr * 402de3b87aSKai Wang elf32_getshdr(Elf_Scn *s) 412de3b87aSKai Wang { 422de3b87aSKai Wang return (_libelf_getshdr(s, ELFCLASS32)); 432de3b87aSKai Wang } 442de3b87aSKai Wang 452de3b87aSKai Wang Elf64_Shdr * 462de3b87aSKai Wang elf64_getshdr(Elf_Scn *s) 472de3b87aSKai Wang { 482de3b87aSKai Wang return (_libelf_getshdr(s, ELFCLASS64)); 492de3b87aSKai Wang } 502de3b87aSKai Wang 512de3b87aSKai Wang GElf_Shdr * 522de3b87aSKai Wang gelf_getshdr(Elf_Scn *s, GElf_Shdr *d) 532de3b87aSKai Wang { 542de3b87aSKai Wang int ec; 552de3b87aSKai Wang void *sh; 562de3b87aSKai Wang Elf32_Shdr *sh32; 572de3b87aSKai Wang Elf64_Shdr *sh64; 582de3b87aSKai Wang 592de3b87aSKai Wang if (d == NULL) { 602de3b87aSKai Wang LIBELF_SET_ERROR(ARGUMENT, 0); 612de3b87aSKai Wang return (NULL); 622de3b87aSKai Wang } 632de3b87aSKai Wang 642de3b87aSKai Wang if ((sh = _libelf_getshdr(s, ELFCLASSNONE)) == NULL) 652de3b87aSKai Wang return (NULL); 662de3b87aSKai Wang 672de3b87aSKai Wang ec = s->s_elf->e_class; 682de3b87aSKai Wang assert(ec == ELFCLASS32 || ec == ELFCLASS64); 692de3b87aSKai Wang 702de3b87aSKai Wang if (ec == ELFCLASS32) { 712de3b87aSKai Wang sh32 = (Elf32_Shdr *) sh; 722de3b87aSKai Wang 732de3b87aSKai Wang d->sh_name = sh32->sh_name; 742de3b87aSKai Wang d->sh_type = sh32->sh_type; 752de3b87aSKai Wang d->sh_flags = (Elf64_Xword) sh32->sh_flags; 762de3b87aSKai Wang d->sh_addr = (Elf64_Addr) sh32->sh_addr; 772de3b87aSKai Wang d->sh_offset = (Elf64_Off) sh32->sh_offset; 782de3b87aSKai Wang d->sh_size = (Elf64_Xword) sh32->sh_size; 792de3b87aSKai Wang d->sh_link = sh32->sh_link; 802de3b87aSKai Wang d->sh_info = sh32->sh_info; 812de3b87aSKai Wang d->sh_addralign = (Elf64_Xword) sh32->sh_addralign; 822de3b87aSKai Wang d->sh_entsize = (Elf64_Xword) sh32->sh_entsize; 832de3b87aSKai Wang } else { 842de3b87aSKai Wang sh64 = (Elf64_Shdr *) sh; 852de3b87aSKai Wang *d = *sh64; 862de3b87aSKai Wang } 872de3b87aSKai Wang 882de3b87aSKai Wang return (d); 892de3b87aSKai Wang } 902de3b87aSKai Wang 912de3b87aSKai Wang int 922de3b87aSKai Wang gelf_update_shdr(Elf_Scn *scn, GElf_Shdr *s) 932de3b87aSKai Wang { 942de3b87aSKai Wang int ec; 952de3b87aSKai Wang Elf *e; 962de3b87aSKai Wang Elf32_Shdr *sh32; 972de3b87aSKai Wang 982de3b87aSKai Wang 992de3b87aSKai Wang if (s == NULL || scn == NULL || (e = scn->s_elf) == NULL || 1002de3b87aSKai Wang e->e_kind != ELF_K_ELF || 1012de3b87aSKai Wang ((ec = e->e_class) != ELFCLASS32 && ec != ELFCLASS64)) { 1022de3b87aSKai Wang LIBELF_SET_ERROR(ARGUMENT, 0); 1032de3b87aSKai Wang return (0); 1042de3b87aSKai Wang } 1052de3b87aSKai Wang 1062de3b87aSKai Wang if (e->e_cmd == ELF_C_READ) { 1072de3b87aSKai Wang LIBELF_SET_ERROR(MODE, 0); 1082de3b87aSKai Wang return (0); 1092de3b87aSKai Wang } 1102de3b87aSKai Wang 1112de3b87aSKai Wang (void) elf_flagscn(scn, ELF_C_SET, ELF_F_DIRTY); 1122de3b87aSKai Wang 1132de3b87aSKai Wang if (ec == ELFCLASS64) { 1142de3b87aSKai Wang scn->s_shdr.s_shdr64 = *s; 1152de3b87aSKai Wang return (1); 1162de3b87aSKai Wang } 1172de3b87aSKai Wang 1182de3b87aSKai Wang sh32 = &scn->s_shdr.s_shdr32; 1192de3b87aSKai Wang 1202de3b87aSKai Wang sh32->sh_name = s->sh_name; 1212de3b87aSKai Wang sh32->sh_type = s->sh_type; 1222de3b87aSKai Wang LIBELF_COPY_U32(sh32, s, sh_flags); 1232de3b87aSKai Wang LIBELF_COPY_U32(sh32, s, sh_addr); 1242de3b87aSKai Wang LIBELF_COPY_U32(sh32, s, sh_offset); 1252de3b87aSKai Wang LIBELF_COPY_U32(sh32, s, sh_size); 1262de3b87aSKai Wang sh32->sh_link = s->sh_link; 1272de3b87aSKai Wang sh32->sh_info = s->sh_info; 1282de3b87aSKai Wang LIBELF_COPY_U32(sh32, s, sh_addralign); 1292de3b87aSKai Wang LIBELF_COPY_U32(sh32, s, sh_entsize); 1302de3b87aSKai Wang 1312de3b87aSKai Wang return (1); 1322de3b87aSKai Wang } 133