Linker重定位后初始化

linker重定位后,进行一系列初始化工作,这个阶段,linker已经可以引用外部的符号和全局变量了。

源码

/** This code is called after the linker has linked itself and fixed its own* GOT. It is safe to make references to externs and other non-local data at* this point. The compiler sometimes moves GOT references earlier in a* function, so avoid inlining this function (http://b/80503879).*/
static ElfW(Addr) __attribute__((noinline))
__linker_init_post_relocation(KernelArgumentBlock& args, soinfo& tmp_linker_so) {// Finish initializing the main thread.__libc_init_main_thread_late();//继续main thread初始化//设置gnu_relro段为read-only// We didn't protect the linker's RELRO pages in link_image because we// couldn't make system calls on x86 at that point, but we can now...if (!tmp_linker_so.protect_relro()) __linker_cannot_link(args.argv[0]);// And we can set VMA name for the bss section nowset_bss_vma_name(&tmp_linker_so);//为bss段的vma设置名字// Initialize the linker's static libc's globals__libc_init_globals();//调用libc.so的external函数,对libc一些全局变量进行初始化,主要是vdso的初始化// Initialize the linker's own global variablestmp_linker_so.call_constructors();//linker DSO内部的初始化,执行.init,.init_array等section的初始化函数// When the linker is run directly rather than acting as PT_INTERP, parse// arguments and determine the executable to load. When it's instead acting// as PT_INTERP, AT_ENTRY will refer to the loaded executable rather than the// linker's _start.const char* exe_to_load = nullptr;if (getauxval(AT_ENTRY) == reinterpret_cast<uintptr_t>(&_start)) {if (args.argc == 3 && !strcmp(args.argv[1], "--list")) {// We're being asked to behave like ldd(1).g_is_ldd = true;exe_to_load = args.argv[2];} else if (args.argc <= 1 || !strcmp(args.argv[1], "--help")) {async_safe_format_fd(STDOUT_FILENO,"Usage: %s [--list] PROGRAM [ARGS-FOR-PROGRAM...]\n""       %s [--list] path.zip!/PROGRAM [ARGS-FOR-PROGRAM...]\n""\n""A helper program for linking dynamic executables. Typically, the kernel loads\n""this program because it's the PT_INTERP of a dynamic executable.\n""\n""This program can also be run directly to load and run a dynamic executable. The\n""executable can be inside a zip file if it's stored uncompressed and at a\n""page-aligned offset.\n""\n""The --list option gives behavior equivalent to ldd(1) on other systems.\n",args.argv[0], args.argv[0]);_exit(EXIT_SUCCESS);} else {exe_to_load = args.argv[1];//执行文件的名字,例如app_process64__libc_shared_globals()->initial_linker_arg_count = 1;}}// store argc/argv/envp to use them for calling constructorsg_argc = args.argc - __libc_shared_globals()->initial_linker_arg_count;g_argv = args.argv + __libc_shared_globals()->initial_linker_arg_count;g_envp = args.envp;__libc_shared_globals()->init_progname = g_argv[0];//执行文件的名字,例如app_process64// Initialize static variables. Note that in order to// get correct libdl_info we need to call constructors// before get_libdl_info().sonext = solist = solinker = get_libdl_info(tmp_linker_so);//初始化进程的全局dl infog_default_namespace.add_soinfo(solinker);ElfW(Addr) start_address = linker_main(args, exe_to_load);//对进程的可执行文件进行一系列操作(例如:加载exe到用户空间,获取exe phdr, 对exe进行符号解释和重定位,初始化环境变量,系统属性等),然后返回可执行文件的入口地址,一般情况下,就是main函数if (g_is_ldd) _exit(EXIT_SUCCESS);INFO("[ Jumping to _start (%p)... ]", reinterpret_cast<void*>(start_address));// Return the address that the calling assembly stub should jump to.return start_address;
}

__linker_init_post_relocation函数,主要完成下列工作:

  1. 继续完成main thread的部分初始化工作;(详细参考:Linker和主线程初始化)
  2. 完成libc DSO全局变量的初始化;
  3. 完成linker的内部的初始化;
  4. 执行linker_main,完成一系列,包括:属性初始化,exe加载、加载依赖,符号解释,重定位等等;(详细参考:Linker和Exe加载 : linker_main函数解释)

android linker重定位后初始化相关推荐

  1. android获得图片的坐标,Android百度地图定位后获取周边位置的实现代码

    本文实例讲解Android百度地图定位后获取周边位置的实现代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: 1.布局文件 android:orientation="vertic ...

  2. 知识点讲解三:获取重定位后的网址

    import requestsreq = req.requests.get(url) #下面是重定位后的网址 req.url 需要注意的是要确定网址是否有反扒措施,如果有需要针对其采取措施,否则则不会 ...

  3. S5PV210体系结构与接口04:代码重定位 SDRAM初始化

    目录 1. C语言环境初始化 1.1 C语言运行所需环境 1.2 初始化栈 1.2.1 栈的概念 1.2.2 栈的作用 1.2.3 如何初始化 1.3 初始化bss段 1.3.1 bss段的作用 1. ...

  4. android linker自举

    Android Linker Bootstrap linker作为动态链接器,但本身也是一个共享库,那么它由谁来链接? 1. linker自举 linker的链接是由它本身完成的,称为自举(boots ...

  5. 跟踪线程 深度 双目初始化位姿 运动模型 关键帧模式 重定位 局部地图跟踪 关键帧

    /** * This file is part of ORB-SLAM2. * * * mpMap就是我们整个位姿与地图(可以想象成ORB-SLAM运行时的那个界面世界), * MapPoint和Ke ...

  6. android linker加载

    linker是android的加载器和连接器,同时也是其自身的加载器. bionic/linker/arch/arm64/begin.S 29#include <private/bionic_a ...

  7. 嵌入式裸机课程之C语言程序调用和重定位学习笔记

    一.汇编写启动代码之关看门狗 前期准备工作 1.1 什么是看门狗 看门狗(watchdog timer)电子设备经常会跑飞或者死机(譬如极端炎热.极端寒冷.工业复杂场合) 这种情况我们需要设备自动复位 ...

  8. 第四天:关看门狗、设置栈、控制icache、重定位、链接脚本

    1.汇编写启动代码:关看门狗 什么是看门狗? 看门狗(watch dog timer看门狗定时器),比如:家门口有一只狗,这个狗定时会饿(譬如两小时一饿),狗饿了就会胡乱咬人,人进进出出要想保证安全必 ...

  9. 重定位——重定位的简介与操作(涉及位置无关码)

    以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除. 参考博客:位置无关码.位置有关码 - biaohc - 博客园 一.链接地址与运行地址 1.链接地址 链接地址,是指程序员通过Makef ...

最新文章

  1. C++ 虚函数在基类与派生类对象间的表现及其分析
  2. php amp ldquo 转换,php与html代码的若干转换
  3. 十八、二叉树遍历序列还原
  4. 160个Crackme036
  5. java坐标移动题目case_坐标移动
  6. i386和X86各是什么意思
  7. LeetCode 616. 给字符串添加加粗标签(Trie树)
  8. 从数据库查询数据并输出到前台页面
  9. linux安装taskctl乱码,TASKCTL常见问题和解决方法(FAQ)
  10. 安卓开发之WebView的使用
  11. thinkphp3.1.3框架手册
  12. 转-SIP穿越NAT SIP穿越防火墙
  13. mysql秒退原因_解决MySql客户端秒退问题(找不到my.ini)
  14. html5动态加载图片和加载视频
  15. Openid Connect(OIDC)
  16. 已解决requests.exceptions.ConnectTimeout: HTTPConnectionPool(host=‘123.96.1.95‘, port=30090): Max retri
  17. USB转串口芯片 FT232RL/CH9101/PL2303/CY7C65213同类型芯片参数对比
  18. TechBeat: 强化学习ppo让决策智能演化出无限可能
  19. 2019-多益网络-笔试
  20. [wxWidgets]XRC和动态子菜单

热门文章

  1. ERROR:Could not build wheels for pycocotools, which is required to install pyproject.toml-based
  2. 【CSS】1035- 再看 margin 塌陷和合并问题
  3. Yii2基本使用汇总
  4. 【python】鸡兔同笼
  5. MFC checkbox使用方法
  6. 评“影视制作业看好网播剧,版权价格1年飙升10倍”
  7. grep及基本正则表达式
  8. 主角的超能力有哪些?
  9. 用java写一个表白神器,要有动画效果
  10. 用好项目管理软件,绕开项目管理失败“四宗罪”