1
0
mirror of https://github.com/golang/go synced 2024-11-26 04:58:00 -07:00

6l, 8l: add trivial hash table for dynamic symbols

R=r
https://golang.org/cl/156085
This commit is contained in:
Russ Cox 2009-11-18 15:58:44 -08:00
parent 797cc4904c
commit dc43b74eb1
2 changed files with 42 additions and 36 deletions

View 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
*/

View 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
*/