link_elf.c (78161) | link_elf.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.c 78161 2001-06-13 10:58:39Z peter $ | 26 * $FreeBSD: head/sys/kern/link_elf.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 --- |