Changeset View
Changeset View
Standalone View
Standalone View
contrib/elftoolchain/libelf/elf_update.c
Show First 20 Lines • Show All 446 Lines • ▼ Show 20 Lines | _libelf_resync_sections(Elf *e, off_t rc, struct _Elf_Extent_List *extents) | ||||
size_t sh_type; | size_t sh_type; | ||||
ec = e->e_class; | ec = e->e_class; | ||||
/* | /* | ||||
* Make a pass through sections, computing the extent of each | * Make a pass through sections, computing the extent of each | ||||
* section. | * section. | ||||
*/ | */ | ||||
STAILQ_FOREACH(s, &e->e_u.e_elf.e_scn, s_next) { | RB_FOREACH(s, scntree, &e->e_u.e_elf.e_scn) { | ||||
if (ec == ELFCLASS32) | if (ec == ELFCLASS32) | ||||
sh_type = s->s_shdr.s_shdr32.sh_type; | sh_type = s->s_shdr.s_shdr32.sh_type; | ||||
else | else | ||||
sh_type = s->s_shdr.s_shdr64.sh_type; | sh_type = s->s_shdr.s_shdr64.sh_type; | ||||
if (sh_type == SHT_NOBITS || sh_type == SHT_NULL) | if (sh_type == SHT_NOBITS || sh_type == SHT_NULL) | ||||
continue; | continue; | ||||
▲ Show 20 Lines • Show All 511 Lines • ▼ Show 20 Lines | _libelf_write_shdr(Elf *e, unsigned char *nf, struct _Elf_Extent *ex) | ||||
(void) memset(&src, 0, sizeof(src)); | (void) memset(&src, 0, sizeof(src)); | ||||
src.d_type = ELF_T_SHDR; | src.d_type = ELF_T_SHDR; | ||||
src.d_size = _libelf_msize(ELF_T_SHDR, ec, e->e_version); | src.d_size = _libelf_msize(ELF_T_SHDR, ec, e->e_version); | ||||
src.d_version = dst.d_version = e->e_version; | src.d_version = dst.d_version = e->e_version; | ||||
fsz = _libelf_fsize(ELF_T_SHDR, ec, e->e_version, (size_t) 1); | fsz = _libelf_fsize(ELF_T_SHDR, ec, e->e_version, (size_t) 1); | ||||
STAILQ_FOREACH(scn, &e->e_u.e_elf.e_scn, s_next) { | RB_FOREACH(scn, scntree, &e->e_u.e_elf.e_scn) { | ||||
if (ec == ELFCLASS32) | if (ec == ELFCLASS32) | ||||
src.d_buf = &scn->s_shdr.s_shdr32; | src.d_buf = &scn->s_shdr.s_shdr32; | ||||
else | else | ||||
src.d_buf = &scn->s_shdr.s_shdr64; | src.d_buf = &scn->s_shdr.s_shdr64; | ||||
dst.d_size = fsz; | dst.d_size = fsz; | ||||
dst.d_buf = nf + ex->ex_start + scn->s_ndx * fsz; | dst.d_buf = nf + ex->ex_start + scn->s_ndx * fsz; | ||||
▲ Show 20 Lines • Show All 145 Lines • ▼ Show 20 Lines | #endif /* ELFTC_HAVE_MMAP */ | ||||
/* | /* | ||||
* Reset flags, remove existing section descriptors and | * Reset flags, remove existing section descriptors and | ||||
* {E,P}HDR pointers so that a subsequent elf_get{e,p}hdr() | * {E,P}HDR pointers so that a subsequent elf_get{e,p}hdr() | ||||
* and elf_getscn() will function correctly. | * and elf_getscn() will function correctly. | ||||
*/ | */ | ||||
e->e_flags &= ~ELF_F_DIRTY; | e->e_flags &= ~ELF_F_DIRTY; | ||||
STAILQ_FOREACH_SAFE(scn, &e->e_u.e_elf.e_scn, s_next, tscn) | RB_FOREACH_SAFE(scn, scntree, &e->e_u.e_elf.e_scn, tscn) | ||||
_libelf_release_scn(scn); | _libelf_release_scn(scn); | ||||
if (e->e_class == ELFCLASS32) { | if (e->e_class == ELFCLASS32) { | ||||
free(e->e_u.e_elf.e_ehdr.e_ehdr32); | free(e->e_u.e_elf.e_ehdr.e_ehdr32); | ||||
if (e->e_u.e_elf.e_phdr.e_phdr32) | if (e->e_u.e_elf.e_phdr.e_phdr32) | ||||
free(e->e_u.e_elf.e_phdr.e_phdr32); | free(e->e_u.e_elf.e_phdr.e_phdr32); | ||||
e->e_u.e_elf.e_ehdr.e_ehdr32 = NULL; | e->e_u.e_elf.e_ehdr.e_ehdr32 = NULL; | ||||
▲ Show 20 Lines • Show All 75 Lines • Show Last 20 Lines |