Print this page
4003 dldump() can't deal with extended sections

*** 23,33 **** * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * * dldump(3c) creates a new file image from the specified input file. */ - #pragma ident "%Z%%M% %I% %E% SMI" #include <sys/param.h> #include <sys/procfs.h> #include <fcntl.h> #include <stdio.h> --- 23,32 ----
*** 156,166 **** Elf_Scn *scn; Shdr *shdr; Elf_Data *data; Half endx = 1; int fd = 0, err, num; ! size_t shstr_size = 1; Addr edata; char *shstr, *_shstr, *ipath = NAME(lmp); prstatus_t *status = 0, _status; Lm_list *lml = LIST(lmp); Alist *nodirect = 0; --- 155,165 ---- Elf_Scn *scn; Shdr *shdr; Elf_Data *data; Half endx = 1; int fd = 0, err, num; ! size_t shstr_size = 1, shndx; Addr edata; char *shstr, *_shstr, *ipath = NAME(lmp); prstatus_t *status = 0, _status; Lm_list *lml = LIST(lmp); Alist *nodirect = 0;
*** 307,317 **** } /* * Obtain the input files section header string table. */ ! if ((scn = elf_getscn(ielf, iehdr->e_shstrndx)) == NULL) { eprintf(lml, ERR_ELF, MSG_ORIG(MSG_ELF_GETSCN), ipath); cleanup(ielf, oelf, melf, icache, mcache, fd, opath); return (1); } if ((data = elf_getdata(scn, NULL)) == NULL) { --- 306,322 ---- } /* * Obtain the input files section header string table. */ ! ! if (elf_getshdrstrndx(ielf, &shndx) == -1) { ! eprintf(lml, ERR_ELF, MSG_ORIG(MSG_ELF_GETSHDRSTRNDX), ipath); ! cleanup(ielf, oelf, melf, icache, mcache, fd, opath); ! return (1); ! } ! if ((scn = elf_getscn(ielf, shndx)) == NULL) { eprintf(lml, ERR_ELF, MSG_ORIG(MSG_ELF_GETSCN), ipath); cleanup(ielf, oelf, melf, icache, mcache, fd, opath); return (1); } if ((data = elf_getdata(scn, NULL)) == NULL) {
*** 325,335 **** * Construct a cache to maintain the input files section information. * Obtain an extra cache element if a heap addition is required. Also * add an additional entry (marked FLG_C_END) to make the processing of * this cache easier. */ ! num = iehdr->e_shnum; if (status) num++; if ((icache = malloc((num + 1) * sizeof (Cache))) == 0) { cleanup(ielf, oelf, melf, icache, mcache, fd, opath); return (1); --- 330,348 ---- * Construct a cache to maintain the input files section information. * Obtain an extra cache element if a heap addition is required. Also * add an additional entry (marked FLG_C_END) to make the processing of * this cache easier. */ ! ! if (elf_getshdrnum(ielf, &shndx) == -1) { ! eprintf(lml, ERR_ELF, MSG_ORIG(MSG_ELF_GETSHDRNUM), opath); ! cleanup(ielf, oelf, melf, icache, mcache, fd, opath); ! return (1); ! } ! ! num = shndx; ! if (status) num++; if ((icache = malloc((num + 1) * sizeof (Cache))) == 0) { cleanup(ielf, oelf, melf, icache, mcache, fd, opath); return (1);
*** 622,632 **** --- 635,665 ---- data->d_size = shstr_size; _icache->c_info = shstr; /* LINTED */ + if (elf_ndxscn(scn) >= SHN_LORESERVE) { + Elf_Scn *_scn; + Shdr *shdr0; + + /* + * libelf deals with e_shnum for us, but we + * need to deal with e_shstrndx ourselves. + */ + oehdr->e_shstrndx = SHN_XINDEX; + if ((_scn = elf_getscn(oelf, 0)) == NULL) { + eprintf(lml, ERR_ELF, + MSG_ORIG(MSG_ELF_GETSCN), opath); + cleanup(ielf, oelf, melf, icache, + mcache, fd, opath); + return (1); + } + shdr0 = elf_getshdr(_scn); + shdr0->sh_link = elf_ndxscn(scn); + } else { oehdr->e_shstrndx = (Half)elf_ndxscn(scn); + } } else if (_icache->c_flags == FLG_C_HEAP) { /* * Assign the heap to the appropriate memory offset. */
*** 725,738 **** eprintf(lml, ERR_ELF, MSG_ORIG(MSG_ELF_GETEHDR), opath); cleanup(ielf, oelf, melf, icache, mcache, fd, opath); return (1); } /* * Construct a cache to maintain the memory files section information. */ ! if ((mcache = malloc(mehdr->e_shnum * sizeof (Cache))) == 0) { cleanup(ielf, oelf, melf, icache, mcache, fd, opath); return (1); } _mcache = mcache; _mcache++; --- 758,777 ---- eprintf(lml, ERR_ELF, MSG_ORIG(MSG_ELF_GETEHDR), opath); cleanup(ielf, oelf, melf, icache, mcache, fd, opath); return (1); } + if (elf_getshdrnum(melf, &shndx) == -1) { + eprintf(lml, ERR_ELF, MSG_ORIG(MSG_ELF_GETSHDRNUM), opath); + cleanup(ielf, oelf, melf, icache, mcache, fd, opath); + return (1); + } + /* * Construct a cache to maintain the memory files section information. */ ! if ((mcache = malloc(shndx * sizeof (Cache))) == 0) { cleanup(ielf, oelf, melf, icache, mcache, fd, opath); return (1); } _mcache = mcache; _mcache++;