]> Cypherpunks repositories - gostls13.git/commitdiff
6l: fix divide by zero in glibc linker.
authorRuss Cox <rsc@golang.org>
Tue, 17 Nov 2009 01:40:03 +0000 (17:40 -0800)
committerRuss Cox <rsc@golang.org>
Tue, 17 Nov 2009 01:40:03 +0000 (17:40 -0800)
repeats 8l change http://code.google.com/p/go/source/detail?r=7594e16b5cf9

Fixes #179.

R=iant
https://golang.org/cl/154145

src/cmd/6l/asm.c

index e5aa42c71bb3455e53d860f14b7cd05c40e91d2e..146245c7bd9b88228f50e62693f296dc4113ace5 100644 (file)
@@ -320,15 +320,22 @@ doelf(void)
                addstring(lookup(".interp", 0), linuxdynld);
 
                /*
-                * 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.
+                * hash table.
+                * only entries that other objects need to find when
+                * linking us need to be in the 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);