我正在尝试了解 glibc 动态链接器的工作原理。我知道在_dl_runtime_resolve中调用了_dl_fixup,解决了重定位问题。所以我认为只有在链接器启动并加载了一些库之后才会调用它。但是当我在里面做一些打印工作时,我发现这个函数甚至在 _dl_start 之前就被调用了。令人困惑:为什么叫它?它做了哪些工作?
我做了一些打印工作,该函数正在处理 strncpy、fopen、fread64 等符号,但对象名称 (l->l_name) 似乎为空。
我使用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/