From: Russ Cox Date: Mon, 2 Nov 2009 22:00:32 +0000 (-0800) Subject: fix divide by zero in old glibc dynamic loader X-Git-Tag: weekly.2009-11-06~126 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6334b499e84090fe0c7bbd64fad866463cae7c3f;p=gostls13.git fix divide by zero in old glibc dynamic loader R=r CC=iant http://go/go-review/1018024 --- diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c index 559d816bd7..6dfdc387a8 100644 --- a/src/cmd/8l/asm.c +++ b/src/cmd/8l/asm.c @@ -307,14 +307,21 @@ doelf(void) /* * hash table - empty for now. - * we should have to fill it out with an entry for every - * symbol in .dynsym, but it seems to work not to, - * which is fine with me. + * only entries that other objects need to find when + * linking us need to be in this table. right now that + * is no entries. + * + * must have at least 1 bucket, though, to avoid + * a divide by zero bug in some copies of the + * glibc dynamic loader. */ s = lookup(".hash", 0); s->type = SDATA; // TODO: rodata s->reachable = 1; - s->value += 8; // two leading zeros + adduint32(s, 1); // nbucket + adduint32(s, 1); // nchain + adduint32(s, 0); // bucket[0] + adduint32(s, 0); // chain[0] /* dynamic symbol table - first entry all zeros */ s = lookup(".dynsym", 0);