android linker重定位后初始化
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
函数,主要完成下列工作:
- 继续完成
main thread
的部分初始化工作;(详细参考:Linker和主线程初始化)- 完成
libc DSO
全局变量的初始化;- 完成
linker
的内部的初始化;- 执行
linker_main
,完成一系列,包括:属性初始化,exe加载、加载依赖,符号解释,重定位等等;(详细参考:Linker和Exe加载 : linker_main函数解释)
android linker重定位后初始化相关推荐
- android获得图片的坐标,Android百度地图定位后获取周边位置的实现代码
本文实例讲解Android百度地图定位后获取周边位置的实现代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: 1.布局文件 android:orientation="vertic ...
- 知识点讲解三:获取重定位后的网址
import requestsreq = req.requests.get(url) #下面是重定位后的网址 req.url 需要注意的是要确定网址是否有反扒措施,如果有需要针对其采取措施,否则则不会 ...
- 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. ...
- android linker自举
Android Linker Bootstrap linker作为动态链接器,但本身也是一个共享库,那么它由谁来链接? 1. linker自举 linker的链接是由它本身完成的,称为自举(boots ...
- 跟踪线程 深度 双目初始化位姿 运动模型 关键帧模式 重定位 局部地图跟踪 关键帧
/** * This file is part of ORB-SLAM2. * * * mpMap就是我们整个位姿与地图(可以想象成ORB-SLAM运行时的那个界面世界), * MapPoint和Ke ...
- android linker加载
linker是android的加载器和连接器,同时也是其自身的加载器. bionic/linker/arch/arm64/begin.S 29#include <private/bionic_a ...
- 嵌入式裸机课程之C语言程序调用和重定位学习笔记
一.汇编写启动代码之关看门狗 前期准备工作 1.1 什么是看门狗 看门狗(watchdog timer)电子设备经常会跑飞或者死机(譬如极端炎热.极端寒冷.工业复杂场合) 这种情况我们需要设备自动复位 ...
- 第四天:关看门狗、设置栈、控制icache、重定位、链接脚本
1.汇编写启动代码:关看门狗 什么是看门狗? 看门狗(watch dog timer看门狗定时器),比如:家门口有一只狗,这个狗定时会饿(譬如两小时一饿),狗饿了就会胡乱咬人,人进进出出要想保证安全必 ...
- 重定位——重定位的简介与操作(涉及位置无关码)
以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除. 参考博客:位置无关码.位置有关码 - biaohc - 博客园 一.链接地址与运行地址 1.链接地址 链接地址,是指程序员通过Makef ...
最新文章
- C++ 虚函数在基类与派生类对象间的表现及其分析
- php amp ldquo 转换,php与html代码的若干转换
- 十八、二叉树遍历序列还原
- 160个Crackme036
- java坐标移动题目case_坐标移动
- i386和X86各是什么意思
- LeetCode 616. 给字符串添加加粗标签(Trie树)
- 从数据库查询数据并输出到前台页面
- linux安装taskctl乱码,TASKCTL常见问题和解决方法(FAQ)
- 安卓开发之WebView的使用
- thinkphp3.1.3框架手册
- 转-SIP穿越NAT SIP穿越防火墙
- mysql秒退原因_解决MySql客户端秒退问题(找不到my.ini)
- html5动态加载图片和加载视频
- Openid Connect(OIDC)
- 已解决requests.exceptions.ConnectTimeout: HTTPConnectionPool(host=‘123.96.1.95‘, port=30090): Max retri
- USB转串口芯片 FT232RL/CH9101/PL2303/CY7C65213同类型芯片参数对比
- TechBeat: 强化学习ppo让决策智能演化出无限可能
- 2019-多益网络-笔试
- [wxWidgets]XRC和动态子菜单
热门文章
- ERROR:Could not build wheels for pycocotools, which is required to install pyproject.toml-based
- 【CSS】1035- 再看 margin 塌陷和合并问题
- Yii2基本使用汇总
- 【python】鸡兔同笼
- MFC checkbox使用方法
- 评“影视制作业看好网播剧,版权价格1年飙升10倍”
- grep及基本正则表达式
- 主角的超能力有哪些?
- 用java写一个表白神器,要有动画效果
- 用好项目管理软件,绕开项目管理失败“四宗罪”