Print this page
4383 libelf can't write extended sections when ELF_F_LAYOUT
*** 345,355 ****
Elf_Scn * s;
register Lword sz;
Ehdr * eh = elf->ed_ehdr;
unsigned ver = eh->e_version;
register char *p = (char *)eh->e_ident;
!
/*
* Ehdr and Phdr table go first
*/
p[EI_MAG0] = ELFMAG0;
--- 345,355 ----
Elf_Scn * s;
register Lword sz;
Ehdr * eh = elf->ed_ehdr;
unsigned ver = eh->e_version;
register char *p = (char *)eh->e_ident;
! size_t scncnt;
/*
* Ehdr and Phdr table go first
*/
p[EI_MAG0] = ELFMAG0;
*** 382,407 ****
* Loop through sections, skipping index zero.
* Compute section size before changing hi.
* Allow null buffers for NOBITS.
*/
! if ((s = elf->ed_hdscn) == 0)
eh->e_shnum = 0;
! else {
! eh->e_shnum = 1;
! *(Shdr*)s->s_shdr = _elf_snode_init.sb_shdr;
s = s->s_next;
}
for (; s != 0; s = s->s_next) {
register Dnode *d;
register Lword fsz, j;
Shdr *sh = s->s_shdr;
if ((s->s_myflags & SF_READY) == 0)
(void) _elfxx_cookscn(s);
! ++eh->e_shnum;
sz = 0;
for (d = s->s_hdnode; d != 0; d = d->db_next) {
if ((fsz = elf_fsize(d->db_data.d_type, 1,
ver)) == 0)
return (0);
--- 382,407 ----
* Loop through sections, skipping index zero.
* Compute section size before changing hi.
* Allow null buffers for NOBITS.
*/
! if ((s = elf->ed_hdscn) == 0) {
eh->e_shnum = 0;
! scncnt = 0;
! } else {
! scncnt = 1;
s = s->s_next;
}
for (; s != 0; s = s->s_next) {
register Dnode *d;
register Lword fsz, j;
Shdr *sh = s->s_shdr;
if ((s->s_myflags & SF_READY) == 0)
(void) _elfxx_cookscn(s);
! ++scncnt;
sz = 0;
for (d = s->s_hdnode; d != 0; d = d->db_next) {
if ((fsz = elf_fsize(d->db_data.d_type, 1,
ver)) == 0)
return (0);
*** 423,439 ****
}
/*
* Shdr table last. Comment above for phnum/phoff applies here.
*/
! if (eh->e_shnum != 0)
/* LINTED */
eh->e_shentsize = (Half)elf_fsize(ELF_T_SHDR, 1, ver);
! else
eh->e_shentsize = 0;
! if ((sz = eh->e_shoff + eh->e_shentsize * eh->e_shnum) > hi)
hi = sz;
#ifdef TEST_SIZE
if (test_size(hi) == 0)
return (0);
--- 423,448 ----
}
/*
* Shdr table last. Comment above for phnum/phoff applies here.
*/
! if (scncnt != 0) {
/* LINTED */
eh->e_shentsize = (Half)elf_fsize(ELF_T_SHDR, 1, ver);
! if (scncnt < SHN_LORESERVE) {
! eh->e_shnum = scncnt;
! } else {
! Shdr *sh;
! sh = (Shdr *)elf->ed_hdscn->s_shdr;
! sh->sh_size = scncnt;
! eh->e_shnum = 0;
! }
! } else {
eh->e_shentsize = 0;
+ }
! if ((sz = eh->e_shoff + eh->e_shentsize * scncnt) > hi)
hi = sz;
#ifdef TEST_SIZE
if (test_size(hi) == 0)
return (0);