Cleanup to better match our coding style guide; renamed variables, etc..

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7525 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2004-05-11 17:29:19 +00:00
parent 7e323e80d6
commit d14f9aac93
+77 -73
View File
@@ -29,30 +29,31 @@
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#define ELF_TRACE 0 //#define TRACE_ELF
#if ELF_TRACE #ifdef TRACE_ELF
# define PRINT(x) dprintf x
# define TRACE(x) dprintf x # define TRACE(x) dprintf x
#else #else
# define PRINT(x) ;
# define TRACE(x) ; # define TRACE(x) ;
#endif #endif
// ToDo: this shall contain a list of linked images (one day)
// this is a preparation for shared libraries in the kernel
// and not yet used.
#if 0
typedef struct elf_linked_image {
struct elf_linked_image *next;
struct elf_image_info *image;
} elf_linked_image;
#endif
#define IMAGE_HASH_SIZE 16 #define IMAGE_HASH_SIZE 16
static hash_table *sImagesHash; static hash_table *sImagesHash;
// XXX TK this shall contain a list of linked images static struct elf_image_info *sKernelImage = NULL;
// (don't know enough about ELF how to get this list) static mutex sImageMutex;
typedef struct elf_linked_image { static mutex sImageLoadMutex;
struct elf_linked_image *next;
struct elf_image_info *image;
} elf_linked_image;
static struct elf_image_info *kernel_image = NULL;
static mutex image_lock;
static mutex image_load_lock;
static status_t elf_unload_image(struct elf_image_info *image); static status_t elf_unload_image(struct elf_image_info *image);
@@ -124,9 +125,9 @@ elf_lookup_symbol_address(addr address, addr *baseAddress, char *text, size_t le
uint32 i; uint32 i;
int j,rv; int j,rv;
PRINT(("looking up %p\n",(void *)address)); TRACE(("looking up %p\n",(void *)address));
mutex_lock(&image_lock); mutex_lock(&sImageMutex);
hash_open(sImagesHash, &iterator); hash_open(sImagesHash, &iterator);
found_sym = 0; found_sym = 0;
@@ -134,19 +135,19 @@ elf_lookup_symbol_address(addr address, addr *baseAddress, char *text, size_t le
found_delta = 0x7fffffff; found_delta = 0x7fffffff;
while ((image = hash_next(sImagesHash, &iterator)) != NULL) { while ((image = hash_next(sImagesHash, &iterator)) != NULL) {
PRINT((" image %p, base = %p, size = %p\n", image, (void *)image->regions[0].start, (void *)image->regions[0].size)); TRACE((" image %p, base = %p, size = %p\n", image, (void *)image->regions[0].start, (void *)image->regions[0].size));
if ((address < image->regions[0].start) || (address >= (image->regions[0].start + image->regions[0].size))) if ((address < image->regions[0].start) || (address >= (image->regions[0].start + image->regions[0].size)))
continue; continue;
PRINT((" searching...\n")); TRACE((" searching...\n"));
found_image = image; found_image = image;
for (i = 0; i < HASHTABSIZE(image); i++) { for (i = 0; i < HASHTABSIZE(image); i++) {
for (j = HASHBUCKETS(image)[i]; j != STN_UNDEF; j = HASHCHAINS(image)[j]) { for (j = HASHBUCKETS(image)[i]; j != STN_UNDEF; j = HASHCHAINS(image)[j]) {
long d; long d;
sym = &image->syms[j]; sym = &image->syms[j];
PRINT((" %p looking at %s, type = %d, bind = %d, addr = %p\n",sym,SYMNAME(image, sym),ELF32_ST_TYPE(sym->st_info),ELF32_ST_BIND(sym->st_info),(void *)sym->st_value)); TRACE((" %p looking at %s, type = %d, bind = %d, addr = %p\n",sym,SYMNAME(image, sym),ELF32_ST_TYPE(sym->st_info),ELF32_ST_BIND(sym->st_info),(void *)sym->st_value));
PRINT((" symbol: %lx (%x + %lx)\n", sym->st_value + image->regions[0].delta, sym->st_value, image->regions[0].delta)); TRACE((" symbol: %lx (%x + %lx)\n", sym->st_value + image->regions[0].delta, sym->st_value, image->regions[0].delta));
if ((ELF32_ST_TYPE(sym->st_info) != STT_FUNC) || (ELF32_ST_BIND(sym->st_info) != STB_GLOBAL)) if ((ELF32_ST_TYPE(sym->st_info) != STT_FUNC) || (ELF32_ST_BIND(sym->st_info) != STB_GLOBAL))
continue; continue;
@@ -162,9 +163,9 @@ elf_lookup_symbol_address(addr address, addr *baseAddress, char *text, size_t le
} }
if (found_sym != 0) { if (found_sym != 0) {
PRINT(("symbol at %p, in image %p, name = %s\n", found_sym, found_image, found_image->name)); TRACE(("symbol at %p, in image %p, name = %s\n", found_sym, found_image, found_image->name));
PRINT(("name index %d, '%s'\n", found_sym->st_name, SYMNAME(found_image, found_sym))); TRACE(("name index %d, '%s'\n", found_sym->st_name, SYMNAME(found_image, found_sym)));
PRINT(("addr = %#lx, offset = %#lx\n",(found_sym->st_value + found_image->regions[0].delta),found_delta)); TRACE(("addr = %#lx, offset = %#lx\n",(found_sym->st_value + found_image->regions[0].delta),found_delta));
strlcpy(text, SYMNAME(found_image, found_sym), length); strlcpy(text, SYMNAME(found_image, found_sym), length);
@@ -173,13 +174,13 @@ elf_lookup_symbol_address(addr address, addr *baseAddress, char *text, size_t le
rv = B_OK; rv = B_OK;
} else { } else {
PRINT(("symbol not found!\n")); TRACE(("symbol not found!\n"));
strlcpy(text, "symbol not found", length); strlcpy(text, "symbol not found", length);
rv = B_ENTRY_NOT_FOUND; rv = B_ENTRY_NOT_FOUND;
} }
hash_close(sImagesHash, &iterator, false); hash_close(sImagesHash, &iterator, false);
mutex_unlock(&image_lock); mutex_unlock(&sImageMutex);
return rv; return rv;
} }
@@ -217,7 +218,7 @@ find_image_by_vnode(void *vnode)
struct hash_iterator iterator; struct hash_iterator iterator;
struct elf_image_info *image; struct elf_image_info *image;
mutex_lock(&image_lock); mutex_lock(&sImageMutex);
hash_open(sImagesHash, &iterator); hash_open(sImagesHash, &iterator);
while ((image = hash_next(sImagesHash, &iterator)) != NULL) { while ((image = hash_next(sImagesHash, &iterator)) != NULL) {
@@ -226,7 +227,7 @@ find_image_by_vnode(void *vnode)
} }
hash_close(sImagesHash, &iterator, false); hash_close(sImagesHash, &iterator, false);
mutex_unlock(&image_lock); mutex_unlock(&sImageMutex);
return image; return image;
} }
@@ -244,7 +245,6 @@ create_image_struct()
image->regions[0].id = -1; image->regions[0].id = -1;
image->regions[1].id = -1; image->regions[1].id = -1;
image->ref_count = 1; image->ref_count = 1;
image->linked_images = NULL;
return image; return image;
} }
@@ -330,8 +330,10 @@ dump_image(int argc, char **argv)
} }
/* XXX - Currently unused // Currently unused
static void dump_symbol(struct elf_image_info *image, struct Elf32_Sym *sym) #if 0
static
void dump_symbol(struct elf_image_info *image, struct Elf32_Sym *sym)
{ {
dprintf("symbol at %p, in image %p\n", sym, image); dprintf("symbol at %p, in image %p\n", sym, image);
@@ -343,7 +345,8 @@ static void dump_symbol(struct elf_image_info *image, struct Elf32_Sym *sym)
dprintf(" st_other 0x%x\n", sym->st_other); dprintf(" st_other 0x%x\n", sym->st_other);
dprintf(" st_shndx %d\n", sym->st_shndx); dprintf(" st_shndx %d\n", sym->st_shndx);
} }
*/ #endif
static struct Elf32_Sym * static struct Elf32_Sym *
elf_find_symbol(struct elf_image_info *image, const char *name) elf_find_symbol(struct elf_image_info *image, const char *name)
@@ -370,7 +373,7 @@ elf_lookup_symbol(image_id id, const char *symbol)
struct elf_image_info *image; struct elf_image_info *image;
struct Elf32_Sym *sym; struct Elf32_Sym *sym;
PRINT(("elf_lookup_symbol: %s\n", symbol)); TRACE(("elf_lookup_symbol: %s\n", symbol));
image = find_image(id); image = find_image(id);
if (!image) if (!image)
@@ -383,7 +386,7 @@ elf_lookup_symbol(image_id id, const char *symbol)
if (sym->st_shndx == SHN_UNDEF) if (sym->st_shndx == SHN_UNDEF)
return 0; return 0;
PRINT(("found: %lx (%x + %lx)\n", sym->st_value + image->regions[0].delta, TRACE(("found: %lx (%x + %lx)\n", sym->st_value + image->regions[0].delta,
sym->st_value, image->regions[0].delta)); sym->st_value, image->regions[0].delta));
return sym->st_value + image->regions[0].delta; return sym->st_value + image->regions[0].delta;
@@ -397,7 +400,7 @@ elf_parse_dynamic_section(struct elf_image_info *image)
int i; int i;
int needed_offset = -1; int needed_offset = -1;
PRINT(("top of elf_parse_dynamic_section\n")); TRACE(("top of elf_parse_dynamic_section\n"));
image->symhash = 0; image->symhash = 0;
image->syms = 0; image->syms = 0;
@@ -452,7 +455,7 @@ elf_parse_dynamic_section(struct elf_image_info *image)
if (!image->symhash || !image->syms || !image->strtab) if (!image->symhash || !image->syms || !image->strtab)
return B_ERROR; return B_ERROR;
PRINT(("needed_offset = %d\n", needed_offset)); TRACE(("needed_offset = %d\n", needed_offset));
if (needed_offset >= 0) if (needed_offset >= 0)
image->needed = STRING(image, needed_offset); image->needed = STRING(image, needed_offset);
@@ -492,7 +495,7 @@ elf_resolve_symbol(struct elf_image_info *image, struct Elf32_Sym *sym, struct e
} }
if (ELF32_ST_BIND(sym2->st_info) != STB_GLOBAL && ELF32_ST_BIND(sym2->st_info) != STB_WEAK) { if (ELF32_ST_BIND(sym2->st_info) != STB_GLOBAL && ELF32_ST_BIND(sym2->st_info) != STB_WEAK) {
PRINT(("elf_resolve_symbol: found symbol '%s' but not exported\n", new_symname)); TRACE(("elf_resolve_symbol: found symbol '%s' but not exported\n", new_symname));
return B_MISSING_SYMBOL; return B_MISSING_SYMBOL;
} }
@@ -503,7 +506,7 @@ elf_resolve_symbol(struct elf_image_info *image, struct Elf32_Sym *sym, struct e
return B_NO_ERROR; return B_NO_ERROR;
case SHN_COMMON: case SHN_COMMON:
// ToDo: finish this // ToDo: finish this
PRINT(("elf_resolve_symbol: COMMON symbol, finish me!\n")); TRACE(("elf_resolve_symbol: COMMON symbol, finish me!\n"));
return B_ERROR; return B_ERROR;
default: default:
// standard symbol // standard symbol
@@ -520,13 +523,13 @@ elf_relocate(struct elf_image_info *image, const char *sym_prepend)
{ {
int status = B_NO_ERROR; int status = B_NO_ERROR;
PRINT(("top of elf_relocate\n")); TRACE(("top of elf_relocate\n"));
// deal with the rels first // deal with the rels first
if (image->rel) { if (image->rel) {
TRACE(("total %i relocs\n", image->rel_len / (int)sizeof(struct Elf32_Rel))); TRACE(("total %i relocs\n", image->rel_len / (int)sizeof(struct Elf32_Rel)));
status = arch_elf_relocate_rel(image, sym_prepend, kernel_image, image->rel, image->rel_len); status = arch_elf_relocate_rel(image, sym_prepend, sKernelImage, image->rel, image->rel_len);
if (status < B_OK) if (status < B_OK)
return status; return status;
} }
@@ -535,15 +538,15 @@ elf_relocate(struct elf_image_info *image, const char *sym_prepend)
TRACE(("total %i plt-relocs\n", image->pltrel_len / (int)sizeof(struct Elf32_Rel))); TRACE(("total %i plt-relocs\n", image->pltrel_len / (int)sizeof(struct Elf32_Rel)));
if (image->pltrel_type == DT_REL) if (image->pltrel_type == DT_REL)
status = arch_elf_relocate_rel(image, sym_prepend, kernel_image, image->pltrel, image->pltrel_len); status = arch_elf_relocate_rel(image, sym_prepend, sKernelImage, image->pltrel, image->pltrel_len);
else else
status = arch_elf_relocate_rela(image, sym_prepend, kernel_image, (struct Elf32_Rela *)image->pltrel, image->pltrel_len); status = arch_elf_relocate_rela(image, sym_prepend, sKernelImage, (struct Elf32_Rela *)image->pltrel, image->pltrel_len);
if (status < B_OK) if (status < B_OK)
return status; return status;
} }
if (image->rela) { if (image->rela) {
status = arch_elf_relocate_rela(image, sym_prepend, kernel_image, image->rela, image->rela_len); status = arch_elf_relocate_rela(image, sym_prepend, sKernelImage, image->rela, image->rela_len);
if (status < B_OK) if (status < B_OK)
return status; return status;
} }
@@ -744,7 +747,7 @@ elf_load_kspace(const char *path, const char *sym_prepend)
int i; int i;
ssize_t len; ssize_t len;
PRINT(("elf_load_kspace: entry path '%s'\n", path)); TRACE(("elf_load_kspace: entry path '%s'\n", path));
fd = sys_open(path, 0); fd = sys_open(path, 0);
if (fd < 0) if (fd < 0)
@@ -756,7 +759,7 @@ elf_load_kspace(const char *path, const char *sym_prepend)
// XXX awful hack to keep someone else from trying to load this image // XXX awful hack to keep someone else from trying to load this image
// probably not a bad thing, shouldn't be too many races // probably not a bad thing, shouldn't be too many races
mutex_lock(&image_load_lock); mutex_lock(&sImageLoadMutex);
// make sure it's not loaded already. Search by vnode // make sure it's not loaded already. Search by vnode
image = find_image_by_vnode(vnode); image = find_image_by_vnode(vnode);
@@ -802,15 +805,15 @@ elf_load_kspace(const char *path, const char *sym_prepend)
goto error2; goto error2;
} }
PRINT(("reading in program headers at 0x%x, len 0x%x\n", eheader->e_phoff, eheader->e_phnum * eheader->e_phentsize)); TRACE(("reading in program headers at 0x%x, len 0x%x\n", eheader->e_phoff, eheader->e_phnum * eheader->e_phentsize));
len = sys_read(fd, eheader->e_phoff, pheaders, eheader->e_phnum * eheader->e_phentsize); len = sys_read(fd, eheader->e_phoff, pheaders, eheader->e_phnum * eheader->e_phentsize);
if (len < 0) { if (len < 0) {
err = len; err = len;
PRINT(("error reading in program headers\n")); TRACE(("error reading in program headers\n"));
goto error3; goto error3;
} }
if (len != eheader->e_phnum * eheader->e_phentsize) { if (len != eheader->e_phnum * eheader->e_phentsize) {
PRINT(("short read while reading in program headers\n")); TRACE(("short read while reading in program headers\n"));
err = -1; err = -1;
goto error3; goto error3;
} }
@@ -820,7 +823,7 @@ elf_load_kspace(const char *path, const char *sym_prepend)
int image_region; int image_region;
int protection; int protection;
PRINT(("looking at program header %d\n", i)); TRACE(("looking at program header %d\n", i));
switch (pheaders[i].p_type) { switch (pheaders[i].p_type) {
case PT_LOAD: case PT_LOAD:
@@ -874,7 +877,7 @@ elf_load_kspace(const char *path, const char *sym_prepend)
} }
image->regions[image_region].delta = image->regions[image_region].start - ROUNDOWN(pheaders[i].p_vaddr, PAGE_SIZE); image->regions[image_region].delta = image->regions[image_region].start - ROUNDOWN(pheaders[i].p_vaddr, PAGE_SIZE);
PRINT(("elf_load_kspace: created a region at %p\n", (void *)image->regions[image_region].start)); TRACE(("elf_load_kspace: created a region at %p\n", (void *)image->regions[image_region].start));
len = sys_read(fd, pheaders[i].p_offset, len = sys_read(fd, pheaders[i].p_offset,
(void *)(image->regions[image_region].start + (pheaders[i].p_vaddr % PAGE_SIZE)), (void *)(image->regions[image_region].start + (pheaders[i].p_vaddr % PAGE_SIZE)),
@@ -913,7 +916,7 @@ elf_load_kspace(const char *path, const char *sym_prepend)
register_elf_image(image); register_elf_image(image);
done: done:
mutex_unlock(&image_load_lock); mutex_unlock(&sImageLoadMutex);
return image->id; return image->id;
@@ -929,7 +932,7 @@ error2:
error1: error1:
free(eheader); free(eheader);
error: error:
mutex_unlock(&image_load_lock); mutex_unlock(&sImageLoadMutex);
error0: error0:
if (vnode) if (vnode)
vfs_put_vnode_ptr(vnode); vfs_put_vnode_ptr(vnode);
@@ -938,7 +941,7 @@ error0:
return err; return err;
} }
#if 0
static int static int
elf_unlink_relocs(struct elf_image_info *image) elf_unlink_relocs(struct elf_image_info *image)
{ {
@@ -952,7 +955,7 @@ elf_unlink_relocs(struct elf_image_info *image)
return B_NO_ERROR; return B_NO_ERROR;
} }
#endif
static void static void
elf_unload_image_final(struct elf_image_info *image) elf_unload_image_final(struct elf_image_info *image)
@@ -980,7 +983,8 @@ elf_unload_image(struct elf_image_info *image)
if (atomic_add(&image->ref_count, -1) > 0) if (atomic_add(&image->ref_count, -1) > 0)
return B_NO_ERROR; return B_NO_ERROR;
elf_unlink_relocs(image); //elf_unlink_relocs(image);
// not yet used
elf_unload_image_final(image); elf_unload_image_final(image);
return B_NO_ERROR; return B_NO_ERROR;
@@ -1003,7 +1007,7 @@ elf_unload_kspace(const char *path)
if (err < 0) if (err < 0)
goto error0; goto error0;
mutex_lock(&image_load_lock); mutex_lock(&sImageLoadMutex);
image = find_image_by_vnode(vnode); image = find_image_by_vnode(vnode);
if (!image) { if (!image) {
@@ -1015,7 +1019,7 @@ elf_unload_kspace(const char *path)
err = elf_unload_image(image); err = elf_unload_image(image);
error: error:
mutex_unlock(&image_load_lock); mutex_unlock(&sImageLoadMutex);
error0: error0:
if(vnode) if(vnode)
vfs_put_vnode_ptr(vnode); vfs_put_vnode_ptr(vnode);
@@ -1083,8 +1087,8 @@ elf_init(kernel_args *ka)
image_init(); image_init();
mutex_init(&image_lock, "kimages_lock"); mutex_init(&sImageMutex, "kimages_lock");
mutex_init(&image_load_lock, "kimages_load_lock"); mutex_init(&sImageLoadMutex, "kimages_load_lock");
sImagesHash = hash_init(IMAGE_HASH_SIZE, 0, image_compare, image_hash); sImagesHash = hash_init(IMAGE_HASH_SIZE, 0, image_compare, image_hash);
if (sImagesHash == NULL) if (sImagesHash == NULL)
@@ -1093,36 +1097,36 @@ elf_init(kernel_args *ka)
// Build a image structure for the kernel, which has already been loaded. // Build a image structure for the kernel, which has already been loaded.
// The VM has created areas for it under a known name already // The VM has created areas for it under a known name already
kernel_image = create_image_struct(); sKernelImage = create_image_struct();
kernel_image->name = strdup("kernel"); sKernelImage->name = strdup("kernel");
// text segment // text segment
kernel_image->regions[0].id = find_area("kernel_ro"); sKernelImage->regions[0].id = find_area("kernel_ro");
if (kernel_image->regions[0].id < 0) if (sKernelImage->regions[0].id < 0)
panic("elf_init: could not look up kernel text segment region\n"); panic("elf_init: could not look up kernel text segment region\n");
get_area_info(kernel_image->regions[0].id, &areaInfo); get_area_info(sKernelImage->regions[0].id, &areaInfo);
kernel_image->regions[0].start = (addr)areaInfo.address; sKernelImage->regions[0].start = (addr)areaInfo.address;
kernel_image->regions[0].size = areaInfo.size; sKernelImage->regions[0].size = areaInfo.size;
// data segment // data segment
kernel_image->regions[1].id = find_area("kernel_rw"); sKernelImage->regions[1].id = find_area("kernel_rw");
if (kernel_image->regions[1].id < 0) if (sKernelImage->regions[1].id < 0)
panic("elf_init: could not look up kernel data segment region\n"); panic("elf_init: could not look up kernel data segment region\n");
get_area_info(kernel_image->regions[1].id, &areaInfo); get_area_info(sKernelImage->regions[1].id, &areaInfo);
kernel_image->regions[1].start = (addr)areaInfo.address; sKernelImage->regions[1].start = (addr)areaInfo.address;
kernel_image->regions[1].size = areaInfo.size; sKernelImage->regions[1].size = areaInfo.size;
// we know where the dynamic section is // we know where the dynamic section is
kernel_image->dynamic_ptr = (addr)ka->kernel_dynamic_section_addr.start; sKernelImage->dynamic_ptr = (addr)ka->kernel_dynamic_section_addr.start;
// parse the dynamic section // parse the dynamic section
if (elf_parse_dynamic_section(kernel_image) < 0) if (elf_parse_dynamic_section(sKernelImage) < 0)
dprintf("elf_init: WARNING elf_parse_dynamic_section couldn't find dynamic section.\n"); dprintf("elf_init: WARNING elf_parse_dynamic_section couldn't find dynamic section.\n");
// insert it first in the list of kernel images loaded // insert it first in the list of kernel images loaded
register_elf_image(kernel_image); register_elf_image(sKernelImage);
// Build image structures for all preloaded images. // Build image structures for all preloaded images.
// Again, the VM has already created areas for them. // Again, the VM has already created areas for them.