首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获得在Linux下运行的可执行二进制文件?

如何获得在Linux下运行的可执行二进制文件?
EN

Stack Overflow用户
提问于 2018-01-02 05:11:09
回答 2查看 0关注 0票数 0

如何获得在Linux下运行的可执行二进制文件?

如何将文件加载到内存以及如何开始执行代码?

EN

回答 2

Stack Overflow用户

发布于 2018-01-02 13:15:57

Linux 4.0系统调用

  • fs/exec.c 定义了系统调用 SYSCALL_DEFINE3(execve 简单地转发给do_execve
  • do_execve 前进到do_execveat_common
  • do_execveat_common 要查找下一个主要功能,请跟踪返回值retval的上次修改时间。 开始构建一个struct linux_binprm *bprm描述程序,并将其传递exec_binprm给执行。
  • exec_binprm 再次,按照返回值找到下一个主要的call。
  • search_binary_handler
    • 处理程序由可执行文件的第一个字节决定。 两个最常见的处理程序是解释文件(#!magic)和ELF(\x7fELFmagic)的处理程序,但还有其他内置的内核,例如a.out。用户也可以通过/ proc / sys / fs / binfmt_misc注册 ELF处理程序定义在fs/binfmt_elf.c
    • formats列表包含所有的处理程序。 每个处理程序文件包含如下所示 static int __init init_elf_binfmt(void) { register_binfmt(&elf_format); return 0; }elf_format是一个struct linux_binfmt在该文件中定义。 __init把这个代码放到一个magic部分,在内核启动时被调用:__init在Linux内核代码中意味着什么? 链接器级别的依赖注入!
    • 还有一个递归计数器,以防解释器无限地执行。 尝试这个: echo '#!/tmp/a' > /tmp/a chmod +x /tmp/a /tmp/a
    • 我们再次遵循返回值来看看接下来会发生什么,并且看到它来自: retval = fmt->load_binary(bprm);
  • fs/binfmt_elf.c:load_binary 是否实际工作:
    • 根据规格解析ELF文件
    • 根据解析出的ELF(memory into a struct linux_binprm,注册成a struct pt_regs)设置进程初始化的程序状态,
    • start_thread,开始运行的地方

待办事项:进一步继续进行来源分析。我期望接下来会发生什么:

  • 内核分析ELF的INTERP头以找到动态加载器(通常设置为/lib64/ld-linux-x86-64.so.2)。
  • 内核将动态加载器和要执行的ELF映射到内存
  • 启动动态加载程序,在内存中带一个指向ELF的指针。
  • 现在在userland,加载器以某种方式解析精灵标题,并dlopen在他们身上
  • dlopen使用可配置的搜索路径来查找这些库,将它们映射到内存,并以某种方式通知ELF在哪里找到其丢失的符号
  • 加载器调用_startELF
票数 0
EN

Stack Overflow用户

发布于 2018-01-02 14:48:57

来自linux内核的两个系统调用是相关的。该fork系统调用(或许或)用于创建新的进程,类似于调用。所述的execve系统调用基本上由排序的替换进程地址空间MMAP从ELF可执行和匿名的段,然后初始化寄存器,包括堆栈指针-ing段)。

X86-64 ABI补充Linux的装配HOWTO详情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100001302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档