From: Russ Cox Date: Wed, 18 Nov 2009 23:58:44 +0000 (-0800) Subject: 6l, 8l: add trivial hash table for dynamic symbols X-Git-Tag: weekly.2009-12-07~208 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=dc43b74eb1a3628adb20269545b9f138d7b5b393;p=gostls13.git 6l, 8l: add trivial hash table for dynamic symbols R=r https://golang.org/cl/156085 --- diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c index 4f7f6e22fe..00d7aca2e3 100644 --- a/src/cmd/6l/asm.c +++ b/src/cmd/6l/asm.c @@ -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-2 -> ... -> 2 -> 1 -> 0 + adduint32(s, h-1); + /* * .dynamic table */ diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c index 689ba12d92..00e9e69257 100644 --- a/src/cmd/8l/asm.c +++ b/src/cmd/8l/asm.c @@ -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-2 -> ... -> 2 -> 1 -> 0 + adduint32(s, h-1); + /* * .dynamic table */