Deleted Added
full compact
link_elf_obj.c (78161) link_elf_obj.c (79224)
1/*-
2 * Copyright (c) 1998-2000 Doug Rabson
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
1/*-
2 * Copyright (c) 1998-2000 Doug Rabson
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: head/sys/kern/link_elf_obj.c 78161 2001-06-13 10:58:39Z peter $
26 * $FreeBSD: head/sys/kern/link_elf_obj.c 79224 2001-07-04 16:20:28Z dillon $
27 */
28
29#include "opt_ddb.h"
30
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/kernel.h>
34#include <sys/lock.h>

--- 491 unchanged lines hidden (view full) ---

526 elf_file_t ef;
527 linker_file_t lf;
528 Elf_Shdr *shdr;
529 int symtabindex;
530 int symstrindex;
531 int symcnt;
532 int strcnt;
533
27 */
28
29#include "opt_ddb.h"
30
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/kernel.h>
34#include <sys/lock.h>

--- 491 unchanged lines hidden (view full) ---

526 elf_file_t ef;
527 linker_file_t lf;
528 Elf_Shdr *shdr;
529 int symtabindex;
530 int symstrindex;
531 int symcnt;
532 int strcnt;
533
534 GIANT_REQUIRED;
535
534 shdr = NULL;
535 lf = NULL;
536
537 NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, filename, p);
538 flags = FREAD;
539 error = vn_open(&nd, &flags, 0);
540 if (error)
541 return error;

--- 110 unchanged lines hidden (view full) ---

652 lf = linker_make_file(filename, &link_elf_class);
653 if (!lf) {
654 error = ENOMEM;
655 goto out;
656 }
657
658 ef = (elf_file_t) lf;
659#ifdef SPARSE_MAPPING
536 shdr = NULL;
537 lf = NULL;
538
539 NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, filename, p);
540 flags = FREAD;
541 error = vn_open(&nd, &flags, 0);
542 if (error)
543 return error;

--- 110 unchanged lines hidden (view full) ---

654 lf = linker_make_file(filename, &link_elf_class);
655 if (!lf) {
656 error = ENOMEM;
657 goto out;
658 }
659
660 ef = (elf_file_t) lf;
661#ifdef SPARSE_MAPPING
660 mtx_lock(&vm_mtx);
661 ef->object = vm_object_allocate(OBJT_DEFAULT, mapsize >> PAGE_SHIFT);
662 if (ef->object == NULL) {
662 ef->object = vm_object_allocate(OBJT_DEFAULT, mapsize >> PAGE_SHIFT);
663 if (ef->object == NULL) {
663 mtx_unlock(&vm_mtx);
664 free(ef, M_LINKER);
665 error = ENOMEM;
666 goto out;
667 }
668 vm_object_reference(ef->object);
669 ef->address = (caddr_t) vm_map_min(kernel_map);
670 error = vm_map_find(kernel_map, ef->object, 0,
671 (vm_offset_t *) &ef->address,
672 mapsize, 1,
673 VM_PROT_ALL, VM_PROT_ALL, 0);
674 if (error) {
675 vm_object_deallocate(ef->object);
664 free(ef, M_LINKER);
665 error = ENOMEM;
666 goto out;
667 }
668 vm_object_reference(ef->object);
669 ef->address = (caddr_t) vm_map_min(kernel_map);
670 error = vm_map_find(kernel_map, ef->object, 0,
671 (vm_offset_t *) &ef->address,
672 mapsize, 1,
673 VM_PROT_ALL, VM_PROT_ALL, 0);
674 if (error) {
675 vm_object_deallocate(ef->object);
676 mtx_unlock(&vm_mtx);
677 ef->object = 0;
678 goto out;
679 }
676 ef->object = 0;
677 goto out;
678 }
680 mtx_unlock(&vm_mtx);
681#else
682 ef->address = malloc(mapsize, M_LINKER, M_WAITOK);
683 if (!ef->address) {
684 error = ENOMEM;
685 goto out;
686 }
687#endif
688 mapbase = ef->address;

--- 11 unchanged lines hidden (view full) ---

700 }
701 bzero(segbase + segs[i]->p_filesz,
702 segs[i]->p_memsz - segs[i]->p_filesz);
703
704#ifdef SPARSE_MAPPING
705 /*
706 * Wire down the pages
707 */
679#else
680 ef->address = malloc(mapsize, M_LINKER, M_WAITOK);
681 if (!ef->address) {
682 error = ENOMEM;
683 goto out;
684 }
685#endif
686 mapbase = ef->address;

--- 11 unchanged lines hidden (view full) ---

698 }
699 bzero(segbase + segs[i]->p_filesz,
700 segs[i]->p_memsz - segs[i]->p_filesz);
701
702#ifdef SPARSE_MAPPING
703 /*
704 * Wire down the pages
705 */
708 mtx_lock(&vm_mtx);
709 vm_map_pageable(kernel_map,
710 (vm_offset_t) segbase,
711 (vm_offset_t) segbase + segs[i]->p_memsz,
712 FALSE);
706 vm_map_pageable(kernel_map,
707 (vm_offset_t) segbase,
708 (vm_offset_t) segbase + segs[i]->p_memsz,
709 FALSE);
713 mtx_unlock(&vm_mtx);
714#endif
715 }
716
717 ef->dynamic = (Elf_Dyn *) (mapbase + phdyn->p_vaddr - base_vaddr);
718
719 lf->address = ef->address;
720 lf->size = mapsize;
721

--- 107 unchanged lines hidden (view full) ---

829#endif
830
831 if (ef->preloaded) {
832 link_elf_unload_preload(file);
833 return;
834 }
835#ifdef SPARSE_MAPPING
836 if (ef->object) {
710#endif
711 }
712
713 ef->dynamic = (Elf_Dyn *) (mapbase + phdyn->p_vaddr - base_vaddr);
714
715 lf->address = ef->address;
716 lf->size = mapsize;
717

--- 107 unchanged lines hidden (view full) ---

825#endif
826
827 if (ef->preloaded) {
828 link_elf_unload_preload(file);
829 return;
830 }
831#ifdef SPARSE_MAPPING
832 if (ef->object) {
837 mtx_lock(&vm_mtx);
838 vm_map_remove(kernel_map, (vm_offset_t) ef->address,
839 (vm_offset_t) ef->address
840 + (ef->object->size << PAGE_SHIFT));
841 vm_object_deallocate(ef->object);
833 vm_map_remove(kernel_map, (vm_offset_t) ef->address,
834 (vm_offset_t) ef->address
835 + (ef->object->size << PAGE_SHIFT));
836 vm_object_deallocate(ef->object);
842 mtx_unlock(&vm_mtx);
843 }
844#else
845 if (ef->address)
846 free(ef->address, M_LINKER);
847#endif
848 if (ef->symbase)
849 free(ef->symbase, M_LINKER);
850 if (ef->strbase)

--- 288 unchanged lines hidden ---
837 }
838#else
839 if (ef->address)
840 free(ef->address, M_LINKER);
841#endif
842 if (ef->symbase)
843 free(ef->symbase, M_LINKER);
844 if (ef->strbase)

--- 288 unchanged lines hidden ---