Date: Mon, 29 Mar 2004 11:12:39 -0800 (PST) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 49907 for review Message-ID: <200403291912.i2TJCd0w037094@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=49907 Change 49907 by peter@peter_daintree on 2004/03/29 11:12:00 move '*' position to a more style compliant place. Affected files ... .. //depot/projects/hammer/sys/kern/link_elf_obj.c#5 edit Differences ... ==== //depot/projects/hammer/sys/kern/link_elf_obj.c#5 (text+ko) ==== @@ -1,5 +1,6 @@ /*- * Copyright (c) 1998-2000 Doug Rabson + * Copyright (c) 2004 Peter Wemm * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -59,7 +60,13 @@ Elf_Off base_offset; Elf_Off filesz; int flags; -} Elf_loadent; +} Elf_progent; + +typedef struct { + Elf_Addr base_vaddr; + Elf_Off filesz; + int flags; +} Elf_nobitent; typedef struct { const Elf_Rel *rel; @@ -74,36 +81,40 @@ typedef struct elf_file { struct linker_file lf; /* Common fields */ - caddr_t address; /* Relocation address */ + caddr_t address; /* Relocation address */ /* XXX OBE */ + + Elf_progent *progtab; + int nprogtab; + + Elf_nobitent *nobittab; + int nnobittab; - Elf_loadseg *segtab; - int nsegtab; Elf_relaent *relatab; int nrela; Elf_relent *reltab; int nrel; - caddr_t modptr; const Elf_Sym* ddbsymtab; /* The symbol table we are using */ long ddbsymcnt; /* Number of symbols */ caddr_t ddbstrtab; /* String table */ long ddbstrcnt; /* number of bytes in string table */ - caddr_t symbase; /* malloc'ed symbold base */ + + caddr_t symbase; /* malloc'ed symbol base */ caddr_t strbase; /* malloc'ed string base */ } *elf_file_t; static int link_elf_link_common_finish(linker_file_t); static int link_elf_link_preload(linker_class_t cls, - const char*, linker_file_t*); + const char *, linker_file_t *); static int link_elf_link_preload_finish(linker_file_t); -static int link_elf_load_file(linker_class_t, const char*, linker_file_t*); -static int link_elf_lookup_symbol(linker_file_t, const char*, - c_linker_sym_t*); +static int link_elf_load_file(linker_class_t, const char *, linker_file_t *); +static int link_elf_lookup_symbol(linker_file_t, const char *, + c_linker_sym_t *); static int link_elf_symbol_values(linker_file_t, c_linker_sym_t, - linker_symval_t*); + linker_symval_t *); static int link_elf_search_symbol(linker_file_t, caddr_t value, - c_linker_sym_t* sym, long* diffp); + c_linker_sym_t *sym, long *diffp); static void link_elf_unload_file(linker_file_t); static int link_elf_lookup_set(linker_file_t, const char *, @@ -134,7 +145,7 @@ link_elf_methods, sizeof(struct elf_file) }; -static int relocate_file(elf_file_t ef); +static int relocate_file(elf_file_t ef); static void link_elf_error(const char *s) @@ -160,7 +171,7 @@ } static void -link_elf_init(void* arg) +link_elf_init(void *arg) { linker_add_class(&link_elf_class); @@ -169,7 +180,7 @@ SYSINIT(link_elf, SI_SUB_KLD, SI_ORDER_SECOND, link_elf_init, 0); static int -link_elf_link_preload(linker_class_t cls, const char* filename, +link_elf_link_preload(linker_class_t cls, const char *filename, linker_file_t *result) { return (EFTYPE); @@ -182,11 +193,11 @@ } static int -link_elf_load_file(linker_class_t cls, const char* filename, - linker_file_t* result) +link_elf_load_file(linker_class_t cls, const char *filename, + linker_file_t *result) { struct nameidata nd; - struct thread* td = curthread; /* XXX */ + struct thread *td = curthread; /* XXX */ Elf_Ehdr *hdr; caddr_t firstpage; int nbytes, i; @@ -243,7 +254,7 @@ nbytes = PAGE_SIZE - resid; if (error) goto out; - if (nbytes < sizeof(Elf_Ehdr)) + if (nbytes < sizeof(Elf_Ehdr)){ error = ENOEXEC; goto out; } @@ -297,6 +308,19 @@ goto out; } + lf = linker_make_file(filename, &link_elf_class); + if (!lf) { + error = ENOMEM; + goto out; + } + + ef = (elf_file_t) lf; + ef->address = malloc(mapsize, M_LINKER, M_WAITOK); + if (!ef->address) { + error = ENOMEM; + goto out; + } + /* * Scan the program header entries, and save key information. * @@ -312,20 +336,20 @@ shdr = (Elf_Shdr *)shtbuf; shlimit = shdr + hdr->e_phnum; - nbits = 0; - nnobits = 0; + ef->nprogent = 0; + ef->nnobits = 0; nsym = 0; - nrel = 0; - nrela = 0; + ef->nrel = 0; + ef->nrela = 0; symtabindex = -1; symstrindex = -1; for (i = 0; i < hdr->e_shnum; i++) { switch (shdr[i].sh_type) { case SHT_PROGBITS: - nprogbits++; + ef->nprogtab++; break; case SHT_NOBITS: - nnobits++; + ef->nnobittab++; break; case SHT_SYMTAB: nsym++; @@ -333,10 +357,10 @@ symstrindex = shdr[i].sh_link; break; case SHT_REL: - nrel++; + ef->nreltab++; break; case SHT_RELA: - nrela++; + ef->nrelatab++; break; } } @@ -358,25 +382,35 @@ } /* XXX *************** STEP 2 GOES HERE ************* XXX */ + if (ef->nprogtab != 0) + ef->progtab = malloc(ef->nprogtab * sizeof(*ef->progtab), M_LINKER, M_WAITOK); + if (ef->nnobittab != 0) + ef->nobittab = malloc(ef->nobbittab * sizeof(*ef->nobittab), M_LINKER, M_WAITOK); + if (ef->nreltab != 0) + ef->reltab = malloc(ef->nreltab * sizeof(*ef->reltab), M_LINKER, M_WAITOK); + if (ef->nrelatab != 0) + ef->relatab = malloc(ef->nrelatab * sizeof(*ef->relatab), M_LINKER, M_WAITOK); + + ef->ddbsymcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym); + ef->ddbsymbase = malloc(shdr[symtabindex].sh_size, M_LINKER, M_WAITOK); + + ef->ddbstrcnt = shdr[symstrindex].sh_size; + ef->ddbstrbase = malloc(shdr[symstrindex].sh_size, M_LINKER, M_WAITOK); + + if (ef->symbase == NULL || ef->strbase == NULL) { + error = ENOMEM; + goto out; + } + for (i = 0; i < hdr->e_shnum; i++) { switch (shdr[i].sh_type) { + } } + /* XXX *************** STEP 3 GOES HERE ************* XXX */ /* Load the symbol table. */ - if (symtabindex < 0 || symstrindex < 0) - goto nosyms; - - symcnt = shdr[symtabindex].sh_size; - ef->symbase = malloc(symcnt, M_LINKER, M_WAITOK); - strcnt = shdr[symstrindex].sh_size; - ef->strbase = malloc(strcnt, M_LINKER, M_WAITOK); - - if (ef->symbase == NULL || ef->strbase == NULL) { - error = ENOMEM; - goto out; - } error = vn_rdwr(UIO_READ, nd.ni_vp, ef->symbase, symcnt, shdr[symtabindex].sh_offset, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, @@ -390,10 +424,6 @@ if (error) goto out; - ef->ddbsymcnt = symcnt / sizeof(Elf_Sym); - ef->ddbsymtab = (const Elf_Sym *)ef->symbase; - ef->ddbstrcnt = strcnt; - ef->ddbstrtab = ef->strbase; /* XXX *************** STEP 4 GOES HERE ************* XXX */ @@ -406,18 +436,6 @@ base_vlimit = round_page(segs[1]->p_vaddr + segs[1]->p_memsz); mapsize = base_vlimit - base_vaddr; - lf = linker_make_file(filename, &link_elf_class); - if (!lf) { - error = ENOMEM; - goto out; - } - - ef = (elf_file_t) lf; - ef->address = malloc(mapsize, M_LINKER, M_WAITOK); - if (!ef->address) { - error = ENOMEM; - goto out; - } mapbase = ef->address; /* @@ -452,11 +470,11 @@ if (error) goto out; - nosyms: +nosyms: *result = lf; - out: +out: if (error && lf) linker_file_unload(lf); if (shdr) @@ -566,11 +584,11 @@ } static int -link_elf_lookup_symbol(linker_file_t lf, const char* name, c_linker_sym_t* sym) +link_elf_lookup_symbol(linker_file_t lf, const char *name, c_linker_sym_t *sym) { elf_file_t ef = (elf_file_t) lf; unsigned long symnum; - const Elf_Sym* symp; + const Elf_Sym *symp; const char *strp; int i; @@ -593,10 +611,10 @@ } static int -link_elf_symbol_values(linker_file_t lf, c_linker_sym_t sym, linker_symval_t* symval) +link_elf_symbol_values(linker_file_t lf, c_linker_sym_t sym, linker_symval_t *symval) { elf_file_t ef = (elf_file_t) lf; - const Elf_Sym* es = (const Elf_Sym*) sym; + const Elf_Sym *es = (const Elf_Sym*) sym; if (es >= ef->ddbsymtab && es < (ef->ddbsymtab + ef->ddbsymcnt)) { symval->name = ef->ddbstrtab + es->st_name; @@ -609,14 +627,14 @@ static int link_elf_search_symbol(linker_file_t lf, caddr_t value, - c_linker_sym_t* sym, long* diffp) + c_linker_sym_t *sym, long *diffp) { elf_file_t ef = (elf_file_t) lf; u_long off = (uintptr_t) (void *) value; u_long diff = off; u_long st_value; - const Elf_Sym* es; - const Elf_Sym* best = 0; + const Elf_Sym *es; + const Elf_Sym *best = 0; int i; for (i = 0, es = ef->ddbsymtab; i < ef->ddbsymcnt; i++, es++) { @@ -705,7 +723,7 @@ link_elf_each_function_name(linker_file_t file, int (*callback)(const char *, void *), void *opaque) { elf_file_t ef = (elf_file_t)file; - const Elf_Sym* symp; + const Elf_Sym *symp; int i, error; /* Exhaustive search */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200403291912.i2TJCd0w037094>