Linux 第七周实验 及总结

姬梦馨

原创作品

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

第七周 Linux内核如何装载和启动一个可执行程序

一:1.可执行程序如何产生的?

linux系统中,可执行程序一般要经过预处理、编译、汇编、链接、执行等步骤。

编译过程
预处理:gcc –E hello.c –o hello.i;  gcc –E调用cpp 生成中间文件
编 译:gcc –S hello.i –o hello.s;  gcc –S调用ccl 翻译成汇编文件
汇 编:gcc –c hello.s –o hello.o;  gcc -c 调用as 翻译成可重定位目标文件
链 接:gcc hello.o –o hello ;      gcc -o 调用ld**   创建可执行目标文件64位机可用参数-m32cpp是指预处理编译文件

  

2.目标文件格式ELF

ELF文件已经是适应到某一种CPU体系结构的二进制兼容文件了。

默认的ELF头加载地址是0x8048000,头部大概要到0x48100处或者0x483000处,也就是可执行文件加载到内存之后

执行的第一条代码地址

查看一个可执行文件头部内容:readelf -h;头部后是代码和数据。

.o文件,可执行文件,都是目标文件,一般使用相同的文件格式。
常用文件格式:

a.out     COFF    PE - WINDOWS上     ELF - LINUX上

ABI:应用程序二进制接口

ELF文件格式中有三种主要的文件格式:

1:可重定位文件
    主要是.o文件,保存有代码和适当数据,和其他的object文件一起来创建一个可执行文件或者共享文件
2:可执行文件
    保存着一个用来执行的程序,指出exec(BA_OS)如何创建程序进程映象。
3:共享目标文件
    保存代码和合适的数据,用来和链接器链接。

链接器分为动态和静态:
链接编辑器,静态链接,和其他的可重定位、共享目标文件创建其他的目标文件
动态链接器,连喝一个可执行文件和其他的共享目标文件来创建一个进程映像

文件格式

Object文件参与程序的联接(创建一个程序)和程序的执行(运行一个程序)。
object 文件格式提供了一个方便有效的方法并行的视角看待文件的内容。

3 静态链接的ELF可执行文件与进程的地址空间

32位x86进程地址空间共4G,1G是内核空间。

一般静态链接会将所有代码放在一个代码段;动态链接的进程会有多个代码段。

二、可执行程序、共享库和动态链接

1:新的可执行程序起点:

  地址空间为0x8048000或0x8048300。

    装载可执行程序之前的工作:
    Shell本身不限制命令行参数的个数,命令行参数的个数受限于命令自身。
    Shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数,传递和保存命令行参数
    和环境变量。

2:命令行参数和环境变量是如何进入新程序的堆栈的?

execve:
main函数需要构造他的执行环境,执行可执行程序;令行参数和环境变量通过系统调用传递到内核处理函数,然后内核处理函数构造新的可执行文件,来初始化新的可执行程序的堆栈,返回到新的可执行程序。

  

3:静态链接的可执行程序和动态链接的可执行程序execve系统调用返回时不同

 静态链接:elf_entry指向可执行文件的头部,一般是main函数;

  动态链接:elf_entry指向ld的起点。

4:sys_execve内部处理过程

      int do_execve(struct filename *filename,       在函数返回中做一个do_execve
      const char __user *const __user *__argv,
          {
        struct user_arg_ptr argv = { .ptr.native = __argv };
        struct user_arg_ptr envp = { .ptr.native = __envp };
        return do_execve_common(filename, argv, envp);
      }

     SYSCALL_DEFINE3(execve,
          const char __user *, filename,
          const char __user *const __user *, argv,
          const char __user *const __user *, envp)
  {
         return do_execve(getname(filename), argv, envp);    转到do _ execve _ common函数
   }
    #ifdef CONFIG_COMPAT
     COMPAT_SYSCALL_DEFINE3(execve, const char __user *, filename,
       const compat_uptr_t __user *, argv,
       const compat_uptr_t __user *, envp)
    {
       return compat_do_execve(getname(filename), argv, envp);
   }
    #endif

    if (!try_module_get(fmt->module))
            continue;
        read_unlock(&binfmt_lock);
        bprm->recursion_depth++;
        retval = fmt->load_binary(bprm);
        read_lock(&binfmt_lock);
        put_binfmt(fmt);
        bprm->recursion_depth--;
在这个循环里寻找能够解析这个当前可执行文件

  

三:实验  GDB跟踪sys_execve内核函数处理过程

1:  内核启动   环境搭建   更新命令

2:在exec函数中执行了动态链接代码  


3:hello.c

4:GDB 内核跟踪及设置断点




实验总结

动态链接的过程主要是动态链接器在起作用,而不是内核.

动态链接分为可执行程序装载时动态链接和运行时动态链接

新的程序开始执行,ELF可执行文件装载完成。


				
时间: 2024-10-10 08:51:56

Linux 第七周实验 及总结的相关文章

20135302魏静静——linux课程第七周实验及总结

linux课程第七周实验及总结 实验及学习总结 1. 编译链接的过程和ELF可执行文件格式(以hello为例) GNU编译系统编译源码: 首先,运行C预处理器(cpp),将.c文件翻译成.i文件——gcc -E -o hello.cpp hello.c -m32 接着,运行C编译器(cc1),将.i文件翻译成ASCII汇编语言文件.s文件——gcc  -S -o hello.s hello.cpp -m32 然后,运行汇编器(as),将.s文件翻译成可重定位目标文件.o文件——gcc -c he

linux 第七周 总结及实验

姬梦馨 原创作品 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第七周 Linux内核如何装载和启动一个可执行程序 一:1.可执行程序如何产生的? linux系统中,可执行程序一般要经过预处理.编译.汇编.链接.执行等步骤. 编译过程 预处理:gcc –E hello.c –o hello.i; gcc –E调用cpp 生成中间文件 编 译:gcc –S hello.i –o hello.s; gcc –S调

Linux 第七周上课笔记系统分区管理,lvm管理

一.diff命令 difffile file1        ##比较两个文件的不同 -c                    ##显示周围的行 -u                    ##按照一个格式统一输出生成补丁 -r                    ##比较两个目录中文件的不同 patchfile file.path   ##打补丁 -b                    ##备份文件 二.grep过滤命令 grep关键字文件|目录##在文件或目录中查找含有关键字的行 -

Linux第七周(10.18-10.25)学习笔记

一.学习目标 1. 了解常见的存储技术(RAM.ROM.磁盘.固态硬盘等) 2. 理解局部性原理 3. 理解缓存思想 4. 理解局部性原理和缓存思想在存储层次结构中的应用 5. 高速缓存的原理和应用 二.学习任务 1. 阅读教材,完成课后练习(书中有参考答案) 重点:6.2 6.3 6.4  6.8 6.9 6.10 6.11 6.12 6.13 2. 考核:练习题把数据变换一下 3. 实验:需要动手的到实验楼中练习一下 三.学习资源 1. 教材:第六章<存储器层次结构> 2. 课程资料:ht

第七周实验总结

Linux中,可以从c源代码生产一个可执行程序,这其中要经过预处理.编译和链接的过程.可以参考以下图来理解这个过程: 其中,目标文件中至少有编译后的机器指令代码.数据,也还包括了链接时所须要的一些信息,比如符号表.调试信息.字符串等.这Linux中,可执行文件的格式现在主要是ELF格式(对应于Windows中PE格式).ELF的格式如下: 链接,是收集.组织程序所需的不同代码和数据的过程,以便程序能被装入内存并被执行.链接过程分为两步:1.空间与地址分配:2.符号解析与重定位. 在Linux中,

linux第七周

可执行程序的装载 一.预处理.编译.链接和目标文件的格式 可执行文件的创建——预处理.编译和链接 cd Code vi hello.c gcc -E -o hello.cpp hello.c -m32 vi hello.cpp gcc -x cpp-output -S -o hello.s hello.cpp -m32 vi hello.s gcc -x assembler -c hello.s -o hello.o -m32 vi hello.o gcc -o hello hello.o -m

马哥Linux第七周课程作业

1.创建一个10G分区,并格式为ext4文件系统: (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl: # 创建10G分区 [[email protected] ~]# fdisk /dev/sdb 命令(输入 m 获取帮助):n   Partition type:    p   primary (0 primary, 0 extended, 4 free)    e   extended Select (default p): p 分

5233杨光--第七周实验报告

学习时间:5小时 学习任务:<深入理解计算机系统>第六章——存储技术及高速缓存部分 (一)存储技术 ***存储器系统是一个具有不同容量.成本和访问时间的存储设备的层次结构.CPU寄存器保存着最常用的数据. ***小而快的高速缓存寄存器靠近CPU,下层存储设备慢而大.便宜. ***基本存储技术 SRAM存储器 DRAM存储器 ROM存储器 旋转和固态的硬盘 ***随机访问存贮器 分为静态(SRAM)和动态(DRAM)两类,SRAM更快更贵,用来作为高速缓存存储器.DRAM用来作为主存以及图形系统

马哥linux第七周作业

1.创建一个10G分区,并格式为ext4文件系统: (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl: (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳: [[email protected] tmp]# fdisk /dev/sda          WARNING: DOS-compatible mode is deprecated. It's strongly recommended