mirror of
https://github.com/golang/go
synced 2024-11-26 13:08:08 -07:00
6l, 8l: add trivial hash table for dynamic symbols
R=r https://golang.org/cl/156085
This commit is contained in:
parent
797cc4904c
commit
dc43b74eb1
@ -315,24 +315,6 @@ doelf(void)
|
|||||||
elfstr[ElfStrDynstr] = addstring(shstrtab, ".dynstr");
|
elfstr[ElfStrDynstr] = addstring(shstrtab, ".dynstr");
|
||||||
elfstr[ElfStrRela] = addstring(shstrtab, ".rela");
|
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 */
|
/* dynamic symbol table - first entry all zeros */
|
||||||
s = lookup(".dynsym", 0);
|
s = lookup(".dynsym", 0);
|
||||||
s->type = SDATA;
|
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
|
* .dynamic table
|
||||||
*/
|
*/
|
||||||
|
@ -305,24 +305,6 @@ doelf(void)
|
|||||||
s->reachable = 1;
|
s->reachable = 1;
|
||||||
s->type = SDATA; // TODO: rodata
|
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 */
|
/* dynamic symbol table - first entry all zeros */
|
||||||
s = lookup(".dynsym", 0);
|
s = lookup(".dynsym", 0);
|
||||||
s->type = SDATA;
|
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
|
* .dynamic table
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user