]> Cypherpunks repositories - gostls13.git/commitdiff
6l, 8l: add trivial hash table for dynamic symbols
authorRuss Cox <rsc@golang.org>
Wed, 18 Nov 2009 23:58:44 +0000 (15:58 -0800)
committerRuss Cox <rsc@golang.org>
Wed, 18 Nov 2009 23:58:44 +0000 (15:58 -0800)
R=r
https://golang.org/cl/156085

src/cmd/6l/asm.c
src/cmd/8l/asm.c

index 4f7f6e22fe5b509fe9d08915f3426e56fbd89026..00d7aca2e39e69e96b3df9975b0457b230b8719e 100644 (file)
@@ -315,24 +315,6 @@ doelf(void)
                elfstr[ElfStrDynstr] = addstring(shstrtab, ".dynstr");
                elfstr[ElfStrRela] = addstring(shstrtab, ".rela");
 
-               /*
-                * 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;
-               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);
                s->type = SDATA;
@@ -393,6 +375,27 @@ doelf(void)
                        }
                }
 
+               /*
+                * 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.
+                *
+                * freebsd insists on having chains enough for all
+                * the local symbols, though.  for now, we just lay
+                * down a trivial hash table with 1 bucket and a long chain,
+                * because no one is actually looking for our symbols.
+                */
+               s = lookup(".hash", 0);
+               s->type = SDATA;        // TODO: rodata
+               s->reachable = 1;
+               adduint32(s, 1);        // nbucket
+               adduint32(s, nsym);     // nchain
+               adduint32(s, nsym-1);   // bucket 0
+               adduint32(s, 0);        // chain 0
+               for(h=1; h<nsym; h++)   // chain nsym-1 -> nsym-2 -> ... -> 2 -> 1 -> 0
+                       adduint32(s, h-1);
+
                /*
                 * .dynamic table
                 */
index 689ba12d92610b8ddf5e3ac4c988abe9c70e2b19..00e9e69257735c24b80a73fdb0451f9e9d02ad54 100644 (file)
@@ -305,24 +305,6 @@ doelf(void)
                s->reachable = 1;
                s->type = SDATA;        // TODO: rodata
 
-               /*
-                * hash table - empty for now.
-                * 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;
-               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);
                s->type = SDATA;
@@ -382,6 +364,27 @@ doelf(void)
                        }
                }
 
+               /*
+                * 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.
+                *
+                * freebsd insists on having chains enough for all
+                * the local symbols, though.  for now, we just lay
+                * down a trivial hash table with 1 bucket and a long chain,
+                * because no one is actually looking for our symbols.
+                */
+               s = lookup(".hash", 0);
+               s->type = SDATA;        // TODO: rodata
+               s->reachable = 1;
+               adduint32(s, 1);        // nbucket
+               adduint32(s, nsym);     // nchain
+               adduint32(s, nsym-1);   // bucket 0
+               adduint32(s, 0);        // chain 0
+               for(h=1; h<nsym; h++)   // chain nsym-1 -> nsym-2 -> ... -> 2 -> 1 -> 0
+                       adduint32(s, h-1);
+
                /*
                 * .dynamic table
                 */