程序加载过程

2019-02-14  本文已影响0人  滨滨_57b5

程序加载时,会加载静态库、动态库和二进制可执行文件等,由此引出几个问题:

当app启动时,系统内核做相应处理后,会交给dyld动态链接器继续处理,即内核态向用户态的切换
此时,dyld会加载相应的动态库,其中包括包含有runtime的动态库libSystem,最终,会调用runtime源码中的void _objc_init(void)函数,这里具体的加载过程,之后再另行总结整理

runtime加载入口函数

void _objc_init(void)
{
    static bool initialized = false;
    if (initialized) return;
    initialized = true;
    
    // fixme defer initialization until an objc-using image is found?
    environ_init();//对log日志系统的初始化
    tls_init();
    static_init();
    lock_init();//锁
    exception_init();//异常
    
    /*通过dyld动态链接器加载runtime所在的动态库libSystem,Runtime向dyld注册回调函数
      使用imageLoader加载新的image镜像加载,会执行对应的回调函数
     */
    _dyld_objc_notify_register(&map_images, load_images, unmap_image);
}

回调函数map_images

map_images

void
map_images(unsigned count, const char * const paths[],
          const struct mach_header * const mhdrs[])
{
    rwlock_writer_t lock(runtimeLock);
    return map_images_nolock(count, paths, mhdrs);
 }

map_images_nolock

 if (hCount > 0) {
        _read_images(hList, hCount, totalClasses, unoptimizedTotalClasses);//这里读取images
    }

_read_images

回调函数load_images

上一篇 下一篇

猜你喜欢

热点阅读