Function report | 
Source Code:fs\binfmt_elf.c | 
Create Date:2022-07-28 20:28:24 | 
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick | 
| home page | Tree | 
| Annotation kernel can get tool activity | Download SCCT | Chinese | 
Name:load_elf_binary
Proto:static int load_elf_binary(struct linux_binprm *bprm)
Type:int
Parameter:
| Type | Parameter | Name | 
|---|---|---|
| struct linux_binprm * | bprm | 
| 683 | struct file * interpreter = NULL | 
| 685 | load_addr_set = 0 | 
| 687 | struct elf64_phdr * elf_ppnt, * elf_phdata, * interp_elf_phdata = NULL | 
| 689 | bss_prot = 0 | 
| 692 | interp_load_addr = 0 | 
| 694 | reloc_func_desc((__unused__)) = 0 | 
| 696 | struct{struct elf64_hdr elf_ex;struct elf64_hdr interp_elf_ex;} * loc | 
| 703 | loc = Allocation memory | 
| 704 | If Not loc Then | 
| 714 | If memcmp( ELF "magic number" , ELFMAG, SELFMAG) != 0 Then Go to out | 
| 719 | If Not elf_check_arch( & elf_ex) Then Go to out | 
| 721 | If That's for binfmt_elf_fdpic to deal with ( & elf_ex) Then Go to out | 
| 727 | If Not elf_phdata Then Go to out | 
| 730 | elf_ppnt = elf_phdata | 
| 742 | If Segment size in file > # chars in a path name including nul || Segment size in file < 2 Then Go to out_free_ph | 
| 747 | If Not elf_interpreter Then Go to out_free_ph | 
| 752 | If retval < 0 Then Go to out_free_interp | 
| 756 | If elf_interpreter[ Segment size in file - 1] != '\0' Then Go to out_free_interp | 
| 759 | interpreter = open_exec(elf_interpreter) | 
| 760 | kfree(elf_interpreter) | 
| 761 | retval = PTR_ERR(interpreter) | 
| 762 | If IS_ERR(interpreter) Then Go to out_free_ph | 
| 769 | would_dump(bprm, interpreter) | 
| 772 | retval = elf_read(interpreter, & interp_elf_ex, size of interp_elf_ex , 0) | 
| 774 | If retval < 0 Then Go to out_free_dentry | 
| 777 | Break | 
| 779 | out_free_interp : | 
| 780 | kfree(elf_interpreter) | 
| 781 | Go to out_free_ph | 
| 784 | elf_ppnt = elf_phdata | 
| 787 | Case p_type == PT_GNU_STACK | 
| 788 | If p_flags & PF_X Then executable_stack = Enable executable stacks | 
| 790 | Else executable_stack = Disable executable stacks | 
| 792 | Break | 
| 798 | If retval Then Go to out_free_dentry | 
| 800 | Break | 
| 804 | If interpreter Then | 
| 807 | If memcmp( ELF "magic number" , ELFMAG, SELFMAG) != 0 Then Go to out_free_dentry | 
| 810 | If Not elf_check_arch( & interp_elf_ex) || That's for binfmt_elf_fdpic to deal with ( & interp_elf_ex) Then Go to out_free_dentry | 
| 817 | If Not interp_elf_phdata Then Go to out_free_dentry | 
| 821 | elf_ppnt = interp_elf_phdata | 
| 828 | If retval Then Go to out_free_dentry | 
| 830 | Break | 
| 842 | If retval Then Go to out_free_dentry | 
| 847 | If retval Then Go to out_free_dentry | 
| 852 | SET_PERSONALITY2(elf_ex, & arch_state) | 
| 859 | setup_new_exec(bprm) | 
| 864 | retval = Finalizes the stack vm_area_struct. The flags and permissions are updated,* the stack is optionally relocated, and some extra space is added. | 
| 866 | If retval < 0 Then Go to out_free_dentry | 
| 869 | elf_bss = 0 | 
| 870 | elf_brk = 0 | 
| 872 | start_code = ~0UL | 
| 873 | end_code = 0 | 
| 874 | start_data = 0 | 
| 875 | end_data = 0 | 
| 883 | total_size = 0 | 
| 897 | If retval Then Go to out_free_dentry | 
| 899 | nbyte = ELF_PAGEOFFSET(elf_bss) | 
| 900 | If nbyte Then | 
| 901 | nbyte = ELF_MIN_ALIGN - nbyte | 
| 919 | vaddr = Segment virtual address | 
| 924 | If e_type == ET_EXEC || load_addr_set Then | 
| 925 | elf_flags |= Interpret addr exactly | 
| 957 | If interpreter Then | 
| 959 | If flags & Randomize virtual address space Then load_bias += arch_mmap_rnd() | 
| 961 | elf_flags |= Interpret addr exactly | 
| 962 | Else load_bias = 0 | 
| 972 | load_bias = ELF_PAGESTART(load_bias - vaddr) | 
| 976 | If Not total_size Then | 
| 978 | Go to out_free_dentry | 
| 987 | Go to out_free_dentry | 
| 990 | If Not load_addr_set Then | 
| 991 | load_addr_set = 1 | 
| 994 | load_bias += error - ELF_PAGESTART(load_bias + vaddr) | 
| 997 | reloc_func_desc = load_bias | 
| 1000 | k = Segment virtual address | 
| 1001 | If k < start_code Then start_code = k | 
| 1003 | If start_data < k Then start_data = k | 
| 1011 | If BAD_ADDR(k) || Segment size in file > Segment size in memory || Segment size in memory > TASK_SIZE || TASK_SIZE - Segment size in memory < k Then | 
| 1016 | Go to out_free_dentry | 
| 1019 | k = Segment virtual address + Segment size in file | 
| 1034 | Entry point virtual address += load_bias | 
| 1037 | start_code += load_bias | 
| 1039 | start_data += load_bias | 
| 1048 | If retval Then Go to out_free_dentry | 
| 1052 | Go to out_free_dentry | 
| 1055 | If interpreter Then | 
| 1064 | interp_load_addr = elf_entry | 
| 1065 | elf_entry += Entry point virtual address | 
| 1072 | reloc_func_desc = interp_load_addr | 
| 1075 | fput(interpreter) | 
| 1076 | Else | 
| 1080 | Go to out_free_dentry | 
| 1084 | kfree(interp_elf_phdata) | 
| 1085 | kfree(elf_phdata) | 
| 1087 | set_binfmt( & elf_format) | 
| 1090 | retval = arch_setup_additional_pages(bprm, !!interpreter) | 
| 1095 | retval = create_elf_tables(bprm, & elf_ex, load_addr, interp_load_addr) | 
| 1100 | start_code = start_code | 
| 1101 | start_data = start_data | 
| 1103 | start_stack = p | 
| 1118 | brk = start_brk = arch_randomize_brk(mm) | 
| 1125 | If personality & MMAP_PAGE_ZERO Then | 
| 1130 | error = vm_mmap(NULL, 0, PAGE_SIZE, page can be read | page can be executed , Interpret addr exactly | Changes are private , 0) | 
| 1134 | regs = current_pt_regs() | 
| 1150 | start_thread(regs, elf_entry, p) | 
| 1151 | retval = 0 | 
| 1152 | out : | 
| 1154 | out_ret : | 
| 1155 | Return retval | 
| 1158 | out_free_dentry : | 
| 1159 | kfree(interp_elf_phdata) | 
| 1161 | If interpreter Then fput(interpreter) | 
| 1163 | out_free_ph : | 
| 1164 | kfree(elf_phdata) | 
| 1165 | Go to out | 
| Source code conversion tool public plug-in interface  | X | 
|---|---|
| Support c/c++/esqlc/java Oracle/Informix/Mysql Plug-in can realize: logical Report Code generation and batch code conversion  |