c - 为什么在动态链接器启动之前调用 _dl_fixup?

标签 c linker glibc

我正在尝试了解 glibc 动态链接器的工作原理。我知道在_dl_runtime_resolve中调用了_dl_fixup,解决了重定位问题。所以我认为只有在链接器启动并加载了一些库之后才会调用它。但是当我在里面做一些打印工作时,我发现这个函数甚至在 _dl_start 之前就被调用了。令人困惑:为什么叫它?它做了哪些工作?

我做了一些打印工作,该函数正在处理 strncpy、fopen、fread64 等符号,但对象名称 (l->l_name) 似乎为空。

I add print sentences in _dl_start and _dl_fixup

I make glibc and test the ld.so, I found "_dl_fixup" appears before and after "_dl_start"

我使用gdb 来调试链接器,我认为gdb 本身使用_dl_fixup 来完成一些任务。如果我不使用 gdb,则 _dl_fixup 将仅在 _dl_start 之后调用。

最佳答案

So I thought it's called only after linker starts and has loaded some libraries

没错。

I find the function is called even before _dl_start

这是不正确的:_dl_fixup 仅在 _dl_start 之后调用。

很遗憾,您没有提供任何有关如何得出错误结论的详细信息,因此无法告诉您哪里出错了,但您确实犯了(至少一个)错误。

关于c - 为什么在动态链接器启动之前调用 _dl_fixup?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34220222/

相关文章:

c - __attribute__((section ("name"))) 用法?

C++符号分析: how to determine which static initialization is performed?

rust - 如何让我的 Rust 程序链接到另一个 glibc?

c - GCC 正在生成充满零的二进制文件

c - 等待几个线程之一完成?

c - "Double dot"C 中的目录名?

c - 根据程序的标准输出将二进制数据传递到程序的标准输入

objective-c - "Reference to ' ' is ambiguous"将纯 C header 包含到 Obj-C iOS 项目时

c - Eclipse CDT/CSFML,加载共享库时出错

gcc - 未找到 GLIBCXX_3.4.9