![](https://csdnimg.cn/release/download_crawler_static/86365716/bg6.jpg)
2674 {
2675 struct dl_open_args args;
2676
2677 __rtld_lock_lock_recursive (GL(dl_load_lock));
2678
2679 args.file = file;
2680 args.mode = mode;
2681 args.caller = caller;
2682 args.map = NULL;
2683
2684 dl_open_worker(&args);
2685 __rtld_lock_unlock_recursive (GL(dl_load_lock));
2686
2687 }
这 里 的 internal_function 是 表 明 这 个 函 数 从 寄 存 器 中 传 递 参 数 , 而 它 的 定 义 在
configure.in 中得到的。
# define internal_function __attribute__ ((regparm (3), stdcall))
这其中的 regparm 就是 gcc 的编译选项是从寄存器传递 3 个参数,而 stdcall 表明这个函
数 是 由 调 用 函 数 来 清 栈 , 而 一 般 的 函 数 是 由 调 用 者 来 负 责 清 栈 , 用 的 是 cdecl 。
__rtld_lock_lock_recursive (GL(dl_load_lock)); 与 __rtld_lock_unlock_recursive
(GL(dl_load_lock));在现在还没有完全定义,至少在 linux 中是没有的,但可以参考在
linux/kmod.c 中的 request_module 中为了防止过度嵌套而加的一个锁。
而其它的内容就是一个封装了。
dl_open_worker 是真正做动态链接库映射并构造一个 struct link_map 而这是一个绝对重
要的数据结构它的定义由于太长,我会放在第二篇文章结束的附录中介绍,因为那时你可以
回头再理解动态链接库加载与解析的过程,而在下面的具体函数中出现了作实用性的解释,
下面我们分段来看:
_dl_open() >> dl_open_worker()
2532 static void
2533 dl_open_worker (void *a)
2534 {
……………………..
2547 args->map = new = _dl_map_object (NULL, file, 0, lt_loaded, 0, mode);