PERFORCE change 50161 for review
Peter Wemm
peter at FreeBSD.org
Thu Apr 1 19:12:21 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=50161
Change 50161 by peter at peter_hammer on 2004/04/01 19:12:15
checkpoint. beginnings of actually implementing real
elf object linkage. oops. ld -shared made things easy
for us and a bunch of relocation modes are missing.
Affected files ...
.. //depot/projects/hammer/sys/kern/link_elf_obj.c#20 edit
Differences ...
==== //depot/projects/hammer/sys/kern/link_elf_obj.c#20 (text+ko) ====
@@ -881,7 +881,7 @@
elf_file_t ef = (elf_file_t)lf;
const Elf_Sym *sym;
const char *symbol;
- int error;
+ Elf_addr ret;
printf("elf_obj_lookup: symidx %ld (< %ld?)\n", symidx, ef->ddbsymcnt);
@@ -892,36 +892,35 @@
sym = ef->ddbsymtab + symidx;
printf("sym: %p (base %p)\n", sym, ef->ddbsymtab);
- /*
- * Don't do a full lookup when the symbol is local. It may even
- * fail because it may not be found through the hash table.
- */
- if (ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
- /* Force lookup failure when we have an insanity. */
- if (sym->st_shndx == SHN_UNDEF)
- return (0);
- return ((Elf_Addr)ef->address + sym->st_value);
+#if 0
+ /* Theoretically we can avoid a lookup for some locals */
+ switch (ELF64_ST_BIND(sym->st_info)) {
+ case STB_LOCAL:
+ case STB_GLOBAL:
+ case STB_WEAK:
}
-
- /*
- * XXX we can avoid doing a hash table based lookup for global
- * symbols as well. This however is not always valid, so we'll
- * just do it the hard way for now. Performance tweaks can
- * always be added.
- */
-
- symbol = ef->ddbstrtab + sym->st_name;
+#endif
+ switch (ELF64_ST_TYPE(sym->st_info)) {
+ case STT_OBJECT:
+ case STT_FUNC:
+ /* Relative to Data or Function name */
+ symbol = ef->ddbstrtab + sym->st_name;
printf("strtab %p, st_name %d\n", ef->ddbstrtab, sym->st_name);
printf("symbol = %p (%s)\n", symbol, symbol);
- /* Force a lookup failure if the symbol name is bogus. */
- if (*symbol == 0)
- return (0);
+ /* Force a lookup failure if the symbol name is bogus. */
+ if (*symbol == 0)
+ return (0);
printf("calling linker_file_lookup_symbol, deps %d\n", deps);
- error = ((Elf_Addr)linker_file_lookup_symbol(lf, symbol, deps));
-printf("linker_file_lookup_symbol returns %d\n", error);
- return error;
+ ret = ((Elf_Addr)linker_file_lookup_symbol(lf, symbol, deps));
+printf("linker_file_lookup_symbol returns %p\n", ret);
+ return ret;
+
+ case STT_SECTION:
+ /* Relative to section number */
+ XXX
+ }
}
static void
More information about the p4-projects
mailing list