PERFORCE change 49694 for review
Peter Wemm
peter at FreeBSD.org
Thu Mar 25 18:02:06 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=49694
Change 49694 by peter at peter_daintree on 2004/03/25 18:01:36
lose SPARSE_MAPPING. Not that it doesn't work, but rather
its code to work around. It might work out that it has to come
back, but thats what we have a SCM for.
Affected files ...
.. //depot/projects/hammer/sys/kern/link_elf_obj.c#4 edit
Differences ...
==== //depot/projects/hammer/sys/kern/link_elf_obj.c#4 (text+ko) ====
@@ -47,11 +47,6 @@
#include <vm/vm.h>
#include <vm/vm_param.h>
-#ifdef SPARSE_MAPPING
-#include <vm/vm_object.h>
-#include <vm/vm_kern.h>
-#include <vm/vm_extern.h>
-#endif
#include <vm/pmap.h>
#include <vm/vm_map.h>
@@ -59,23 +54,36 @@
#include "linker_if.h"
+typedef struct {
+ Elf_Addr base_vaddr;
+ Elf_Off base_offset;
+ Elf_Off filesz;
+ int flags;
+} Elf_loadent;
+
+typedef struct {
+ const Elf_Rel *rel;
+ int relsize;
+} Elf_relent;
+
+typedef struct {
+ const Elf_Rela *rela;
+ int relasize;
+} Elf_relaent;
+
+
typedef struct elf_file {
struct linker_file lf; /* Common fields */
caddr_t address; /* Relocation address */
-#ifdef SPARSE_MAPPING
- vm_object_t object; /* VM object to hold file pages */
-#endif
- caddr_t strtab; /* DT_STRTAB */
- int strsz; /* DT_STRSZ */
- const Elf_Sym* symtab; /* DT_SYMTAB */
- const Elf_Rel* pltrel; /* DT_JMPREL */
- int pltrelsize; /* DT_PLTRELSZ */
- const Elf_Rela* pltrela; /* DT_JMPREL */
- int pltrelasize; /* DT_PLTRELSZ */
- const Elf_Rel* rel; /* DT_REL */
- int relsize; /* DT_RELSZ */
- const Elf_Rela* rela; /* DT_RELA */
- int relasize; /* DT_RELASZ */
+
+ 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 */
@@ -87,20 +95,21 @@
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_symbol_values(linker_file_t, c_linker_sym_t, linker_symval_t*);
+ c_linker_sym_t*);
+static int link_elf_symbol_values(linker_file_t, c_linker_sym_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 *,
- void ***, void ***, int *);
+ void ***, void ***, int *);
static int link_elf_each_function_name(linker_file_t,
- int (*)(const char *, void *), void *);
+ int (*)(const char *, void *), void *);
static void link_elf_reloc_local(linker_file_t);
static kobj_method_t link_elf_methods[] = {
@@ -300,14 +309,16 @@
* XXX 3) read the string and symbol tables so we can do relocations etc
* XXX 4) (later on) load the rest of the entries.
*/
-/* XXX *************** STEP 1 GOES HERE ************* XXX */
shdr = (Elf_Shdr *)shtbuf;
shlimit = shdr + hdr->e_phnum;
+
nbits = 0;
nnobits = 0;
nsym = 0;
nrel = 0;
nrela = 0;
+ symtabindex = -1;
+ symstrindex = -1;
for (i = 0; i < hdr->e_shnum; i++) {
switch (shdr[i].sh_type) {
case SHT_PROGBITS:
@@ -318,6 +329,7 @@
break;
case SHT_SYMTAB:
nsym++;
+ symtabindex = i;
symstrindex = shdr[i].sh_link;
break;
case SHT_REL:
@@ -346,16 +358,9 @@
}
/* XXX *************** STEP 2 GOES HERE ************* XXX */
- symtabindex = -1;
- symstrindex = -1;
for (i = 0; i < hdr->e_shnum; i++) {
switch (shdr[i].sh_type) {
- case SHT_SYMTAB:
- symtabindex = i;
- symstrindex = shdr[i].sh_link;
- break;
- }
}
/* XXX *************** STEP 3 GOES HERE ************* XXX */
@@ -408,30 +413,11 @@
}
ef = (elf_file_t) lf;
-#ifdef SPARSE_MAPPING
- ef->object = vm_object_allocate(OBJT_DEFAULT, mapsize >> PAGE_SHIFT);
- if (ef->object == NULL) {
- error = ENOMEM;
- goto out;
- }
- vm_object_reference(ef->object);
- ef->address = (caddr_t) vm_map_min(kernel_map);
- error = vm_map_find(kernel_map, ef->object, 0,
- (vm_offset_t *) &ef->address,
- mapsize, 1,
- VM_PROT_ALL, VM_PROT_ALL, 0);
- if (error) {
- vm_object_deallocate(ef->object);
- ef->object = 0;
- goto out;
- }
-#else
ef->address = malloc(mapsize, M_LINKER, M_WAITOK);
if (!ef->address) {
error = ENOMEM;
goto out;
}
-#endif
mapbase = ef->address;
/*
@@ -448,16 +434,6 @@
}
bzero(segbase + segs[i]->p_filesz,
segs[i]->p_memsz - segs[i]->p_filesz);
-
-#ifdef SPARSE_MAPPING
- /*
- * Wire down the pages
- */
- vm_map_wire(kernel_map,
- (vm_offset_t) segbase,
- (vm_offset_t) segbase + segs[i]->p_memsz,
- VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES);
-#endif
}
lf->address = ef->address;
@@ -501,17 +477,8 @@
/* Notify MD code that a module is being unloaded. */
elf_cpu_unload_file(file);
-#ifdef SPARSE_MAPPING
- if (ef->object) {
- vm_map_remove(kernel_map, (vm_offset_t) ef->address,
- (vm_offset_t) ef->address
- + (ef->object->size << PAGE_SHIFT));
- vm_object_deallocate(ef->object);
- }
-#else
if (ef->address)
free(ef->address, M_LINKER);
-#endif
if (ef->symbase)
free(ef->symbase, M_LINKER);
if (ef->strbase)
More information about the p4-projects
mailing list