android inker和Exe加载 : linker_main函数解释

手机驱动开发_全网首发!GPU 驱动自升级原理详解 背景GPU 驱动自升级,是在以下两个痛点下催生出来的:1.换机频率降低,手机的生命周期越来越长 智能手机已经不再是一个增量市场,变成一个存量市场。消费者换机频率逐年降低,手机生命周期变长。生命周期变长了以后,那么如何更好地维护老机型就变成一个难题2.开发者需要升级 ROM 才能用到 GPU driver 的新功能 一直以来,游戏开发者想要升级到最新的 GPU 驱动的渠道跟普通... 阅读详情

Linker和Exe加载 : linker_main函数解释

linker main执行的任务前,在linker重定位,libc初始化,主线程初始化等一些列操作完成后,进程的用户空间已经具备动态链接的能力,开始可以动态链接exe相关的依赖了。

linker main源码

static ElfW(Addr) linker_main(KernelArgumentBlock& args, const char* exe_to_load) {
   
   
  ProtectedDataGuard guard;

#if TIMING
  struct timeval t0, t1;
  gettimeofday(&t0, 0);
#endif

  // Sanitize the environment.
  //主要是stdin等重定向到/dev/null,排除掉非法/不安全的环境变量
  __libc_init_AT_SECURE(args.envp);

  // Initialize system properties
  //系统属性初始化
  __system_properties_init(); // may use 'environ'

  // Register the debuggerd signal handler.
  linker_debuggerd_init();

  g_linker_logger.ResetState();

  // Get a few environment variables.
  const char* LD_DEBUG = getenv("LD_DEBUG");
  if (LD_DEBUG != nullptr) {
   
   
    g_ld_debug_verbosity = atoi(LD_DEBUG);
  }

#if defined(__LP64__)
  INFO("[ Android dynamic linker (64-bit) ]");
#else
  INFO("[ Android dynamic linker (32-bit) ]");
#endif

  // These should have been sanitized by __libc_init_AT_SECURE, but the test
  // doesn't cost us anything.
  const char* ldpath_env = nullptr;
  const char* ldpreload_env = nullptr;
  if (!getauxval(AT_SECURE)) {
   
   
    ldpath_env = getenv("LD_LIBRARY_PATH");
    if (ldpath_env != nullptr) {
   
   
      INFO("[ LD_LIBRARY_PATH set to \"%s\" ]", ldpath_env);
    }
    ldpreload_env = getenv("LD_PRELOAD");
    if (ldpreload_env != nullptr) {
   
   
      INFO("[ LD_PRELOAD set to \"%s\" ]", ldpreload_env);
    }
  }

  //动态加载exe elf,由于exe实际上已经被内核加载了,这里仅仅是读取elf的信息和mmap文件到用户空间,而没有加载exe的依赖和进行相关的重定位
  const ExecutableInfo exe_info = exe_to_load ? load_executa
bionic linker代码分析(1) - linker自举 研究bionic是两年前做symbol hook时,分析了linker解析ELF文件的相关代码;去年底Android 7发布之后,为了解决dlopen系统目录下动态库的限制,研究了系统库访问权限的相关代码,彻底把linker自举加载动态库的流程理清楚。 阅读详情

相关推荐

Android Linker分析笔记

这篇笔记做过一次,但是做的不好,现在又重新做一遍,其中有几处借鉴了同学的笔记文档,对此表示感谢。不足之处欢迎交流,我来进行改进,希望能对其他学习这方面东西的同学有所帮助。linkerAndroid系统的加载器/链接器,当上层加载.so文件时,具体的工作就是由linker实际完成的。linker的启动因为linker本身也是一个.so文件,它也需要链接器的装载链接,而这个链接器就是它本身。 首先

wl429585967的博客 4732

so加载 - Linker跟NameSpace知识 (上篇)

so库的加载可是我们日常开发都会用到的,因此系统也提供了非常方便的api给我们进行调用```System.loadLibrary(xxxso);``` 当然,随着版本的变化,loadLibrary也是出现了非常大的变化,最重要的是分水岭是androidN加入了**namespace**机制,可能很多人都是一头雾水噢!这是个啥?我们在动态so加载方案中,会频繁出现这个名词,同时还有一个高频的词就是**Linker**,本期不涉及复杂的技术方案,我们就来深入聊聊,Linker的概念,与namespac

大模型训练 1338

linker机制详解

linker机制详解,这里使用的是android4.4 的源码,其他版本的源码可能该源码有所出入

Android system — 链接器命名空间(linker namespace)源码分析

应用程序对应的可执行文件app_process会创建一个类加载器classloader并调用System.loadLibrary加载so库,最终会调用至android_dlopen_ext;而native的二进制bin文件是通过dlopen获取so库的handle,但是无论是dlopen还是android_dlopen_ext最后都是调用do_dlopen函数,所以从do_dlopen开始分析。android_namespace_link_t::is_accessible()进行权限判断。

一只立志于养老婆的程序猿 2439

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 som

chiefhsing的专栏 351

基于命名空间的动态链接—— 隔离 Android 中应用程序系统的本地库

转载自:https://jackwish.net/namespace-based-dynamic-linking-chn.html 补充谷歌官网文档:https://source.android.com/devices/architecture/vndk/linker-namespace 本文是Namespace based Dynamic Linking - Isolating ...

along 3563

安卓namespace隔离机制

引言 Android从8.0推出Treble计划后,提供了namespace机制。了解容器的同学,便会想到容器的隔离机制就是利用Linux的namepsace,但是此namespace是非彼namespace。Android的namepace是其系统加载so的一种隔离机制,它属于其Linker功能的一个特性。今天抽空总结下Android的namepace相关技术,本次技术分享只涉及到版本10.0及...

fs3296的博客 3129

android linker加载

linkerandroid加载连接器,同时也是其自身的加载器。bionic/linker/arch/arm64/begin.S29#include <private/bionic_asm.h>3031ENTRY(_start)32  mov x0, sp33  bl __linker_init3435  /* linker init returns the _entry add...

zkuili的博客 2441

改变程序入口函数#pragma comment(linker, "/ENTRY:main")

#include #pragma comment(linker, "/ENTRY:foo ")   int main() {      return 0; }   int foo() {      std::cout      return 0; }

比尔丁子 3050

ARM启动代码中_main 与用户主程序main()的区别

STM32启动代码主要是分配堆栈及设置向量表,然后跳转到__main函数。 跳转具体到代码段部分如下: Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main LDR R0, = ...

qlexcel的专栏 2334

android linker 执行流程

通过前一篇的博客,我们知道,在linux kernel加载完可执行程序后,在需要解释器的情况下,返回用户空间时会先跳到解释器的函数中执行,对于android平台而已,就是先跑到_start()函数,然后再跳转到__linker_init()。 bionic/linker/linker.cpp extern "C" ElfW(Addr) __linker_init(void* raw_args)

xiongtiancheng的博客 4290

Android linker 详解

.

kunis的专栏 635

android 禁用dlsym_Android7.0以上命名空间详解(dlopen限制)附上010editor模块

在分析前先说说如何打印linker日志查看linker.cpp源码有如下类似代码LD_LOG(kLogDlopen,"dlopen(name=\"%s\", flags=0x%x, extinfo=%s, caller=\"%s\", caller_ns=%s@%p) ...",跟踪LD_LOG来到linker_logger.cpp中的Log函数void LinkerLogger::Log(uin...

weixin_39588223的博客 1880

浅谈Android系统编译apk后so文件在dlopen时出现linker权限问题

文章目录浅谈Android系统编译apk后so文件在dlopen时出现linker权限问题一、概述二、问题描述三、具体分析四、解决方案五、总结参考 浅谈Android系统编译apk后so文件在dlopen时出现linker权限问题 @auther Jimmy @date 2018.08 一、概述 由于技术能力有限,本文的部分观点可能描述的并非准确,欢迎指正 在早期Android系统源码编译...

Jimmy's Blog 2万+

Android 8.0 - 基于命名空间的动态链接—— 隔离 Android 中应用程序系统的本地库

Android 8.0 - 基于命名空间的动态链接—— 隔离 Android 中应用程序系统的本地库

张同光 (Tongguang Zhang):Hello everyone ! 5588

Android Linker详解

Android Linker详解 Android Linker详解 本文目的 Linker入口 So的装载 总结 本文目的 Unidbg在对So进行模拟执行的时候,需要先将So文件加载到内存,配置So的进程映像,然后使用CPU模拟器(Unicorn、Dynamic等)对So进行模拟执行。本文的目的是为了彻底搞懂So文件是如何加载到内存的,以及加载进内存之后做了什么,史无巨细,握住方向盘 Linker入口 我们在Android程序中,往往会使用到JNI编程来加快某些算法的运行或增加APP的逆向难度。

大数据安全技术学习 5476

android linker 浅析

 android linker 浅析 收藏 http://blog.csdn.net/dinuliang/archive/2010/04/20/5509009.aspx   Android加载/链接器linker 主要用于实现共享库的加载与链接。它支持应用程序对库函数的隐式显式调用。对于隐式调用,应用程序的编译与静态库大致相同,只是在静态链接的时候通过--dynamic-linker

gracioushe的专栏 1426

理解Native Crash处理流程

本文是基于Android 7.0源码,来分析Native Crash流程。 转自 http://gityuan.com/2016/06/25/android-native-crash/ 一、Native Crash 从系统全局来说,Crash分为Framework/App Crash, Native Crash,以及Kernel Crash。 对于framework层或者app层的Cr

明潮的BLOG 7039
上一篇: android linker重定位后初始化
下一篇: android linker 开启日志
malihom
博客等级 码龄16年 10粉丝 47原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值