zoukankan      html  css  js  c++  java
  • Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序

    Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序

    zl + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

    由源代码生成可执行文件

    预处理 => 编译 => 汇编 => 链接

    gcc -E hello.c -o hello.i
    gcc –S hello.i –o hello.s
    gcc –c hello.s –o hello.o
    gcc hello.o –o hello
    

    若无-o指明,生成可执行文件默认为a.out

    目标文件格式

    目标文件分为PE(windows)和ELF(linux)。

    查看ELF文件头部方法:readelf

    静态链接ELF可执行文件默认入口点:0x8048000

    动态链接执行方法:

    $ gcc main.c -o main -L/path/to/your/dir -lshlibexample -ldl -m32
    $ export LD_LIBRARY_PATH=$PWD 
    /*将当前目录加入默认路径,否则main找不到依赖的库文件,当然也可以将库文件copy到默认路径下。*/
    

    -L + 路径 或者 -l + 库名

    静态链接和动态链接的区别

    静态连接:elf_entry指向可执行文件头部,是新程序执行的起点

    动态链接:elf_entry指向ld(动态链接器)的起点,加载load_elf_interp

    实验:GDB调试sys_execve执行过程







    总结:execve的执行过程在前半段和fork类似创建一个新进程,但是在后半段通过sys_execve调用新的程序进入内存执行,使得新程序覆盖了旧程序的数据,实现了新进程的创建

  • 相关阅读:
    机器学习笔记(一)线性回归模型
    为什么拷贝构造函数的参数可以直接去访问它自己的私有成员?
    C++之forward move源码分析
    C++之forward
    C++之不完整的数据类型释放
    C++中typename关键字的使用方法和注意事项(好文收藏)
    C++之左值引用和右值引用
    C++之Class内存
    C++ 之Const
    C++之DISALLOW_COPY_AND_ASSIGN
  • 原文地址:https://www.cnblogs.com/20135319zl/p/5374457.html
Copyright © 2011-2022 走看看