gelf.c revision 30da143285931291f495cc20b5a1b8869f0618a6
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * CDDL HEADER START
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * The contents of this file are subject to the terms of the
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Common Development and Distribution License, Version 1.0 only
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * (the "License"). You may not use this file except in compliance
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * with the License.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * or http://www.opensolaris.org/os/licensing.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * See the License for the specific language governing permissions
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * and limitations under the License.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * When distributing Covered Code, include this CDDL HEADER in each
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * If applicable, add the following below this CDDL HEADER, with the
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * fields enclosed by brackets "[]" replaced with your own identifying
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * information: Portions Copyright [yyyy] [name of copyright owner]
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * CDDL HEADER END
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Use is subject to license terms.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#pragma ident "%Z%%M% %I% %E% SMI"
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Find elf or it's class from a pointer to an Elf_Data struct.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Warning: this Assumes that the Elf_Data is part of a libelf
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Dnode structure, which is expected to be true for any Elf_Data
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * passed into libelf *except* for the xlatetof() and xlatetom() functions.
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore (((Dnode *)(edata))->db_scn->s_elf->ed_class)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore READLOCKS(EDATA_ELF((edata)), EDATA_SCN((edata)))
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore READUNLOCKS(EDATA_ELF((edata)), EDATA_SCN((edata)))
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amoregelf_fsize(Elf * elf, Elf_Type type, size_t count, unsigned ver)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * Don't rely on the idents, a new ehdr doesn't have it!
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov (void) memcpy(dst->e_ident, e->e_ident, EI_NIDENT);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * In case elf isn't cooked.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore (void) memcpy(d->e_ident, src->e_ident, EI_NIDENT);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* LINTED */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* LINTED */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* LINTED */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* could memcpy the rest of these... */
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amoregelf_getphdr(Elf *elf, int ndx, GElf_Phdr *dst)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if ((class != ELFCLASS32) && (class != ELFCLASS64)) {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore Elf32_Phdr *p = &((Elf32_Phdr *)elf32_getphdr(elf))[ndx];
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovgelf_update_phdr(Elf *elf, int ndx, GElf_Phdr *src)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov Elf32_Phdr *dst = &((Elf32_Phdr *)elf32_getphdr(elf))[ndx];
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovunsigned long
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return ((unsigned long)elf32_newphdr(elf, phnum));
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return ((unsigned long)elf64_newphdr(elf, phnum));
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore dst->sh_addralign = (Elf64_Xword)s->sh_addralign;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore dst->sh_entsize = (Elf64_Xword)s->sh_entsize;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore } else if (scn->s_elf->ed_class == ELFCLASS64) {
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amoregelf_update_shdr(Elf_Scn *scn, GElf_Shdr *src)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore dst->sh_offset = (Elf32_Off) src->sh_offset;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore dst->sh_addralign = (Elf32_Word)src->sh_addralign;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore dst->sh_entsize = (Elf32_Word)src->sh_entsize;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore } else if (scn->s_elf->ed_class == ELFCLASS64) {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * gelf_xlatetof/gelf_xlatetom use 'elf' to find the class
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * because these are the odd case where the Elf_Data structs
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * might not have been allocated by libelf (and therefore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * don't have Dnode's associated with them).
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amoregelf_xlatetof(Elf *elf, Elf_Data *dst, const Elf_Data *src, unsigned encode)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if ((elf == NULL) || (dst == NULL) || (src == NULL))
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovgelf_xlatetom(Elf *elf, Elf_Data *dst, const Elf_Data *src, unsigned encode)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if ((elf == NULL) || (dst == NULL) || (src == NULL))
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amoregelf_getsym(Elf_Data * data, int ndx, GElf_Sym * dst)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore dst->st_info = ELF64_ST_INFO(ELF32_ST_BIND(s->st_info),
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amoregelf_update_sym(Elf_Data *dst, int ndx, GElf_Sym *src)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* LINTED */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov d->st_info = ELF32_ST_INFO(ELF64_ST_BIND(src->st_info),
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore ((Elf64_Sym *)dst->d_buf)[ndx] = *((Elf64_Sym *)src);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovgelf_getsyminfo(Elf_Data *data, int ndx, GElf_Syminfo *dst)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore si = &(((Elf32_Syminfo *)data->d_buf)[ndx]);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amoregelf_update_syminfo(Elf_Data *dst, int ndx, GElf_Syminfo *src)
rc = 0;
return (rc);
GElf_Dyn *
int class;
return (NULL);
return (NULL);
return (dst);
rc = 0;
return (rc);
GElf_Sym *
return (NULL);
return (NULL);
*xshndx = 0;
return (symptr);
if (shndxdata) {
int class;
return (NULL);
return (NULL);
return (dst);
rc = 0;
return (rc);
int class;
return (NULL);
return (NULL);
return (dst);
rc = 0;
return (rc);
GElf_Rel *
int class;
return (NULL);
return (NULL);
return (dst);
rc = 0;
return (rc);
GElf_Cap *
int class;
return (NULL);
return (NULL);
return (dst);
rc = 0;
return (rc);