c++ - stub 在可执行文件中

标签 c++ c dll

我已经经历了SO question1SO question2但它们更能描述我的简单问题,这里是:

我有一个动态链接到共享对象(.dll、.so 或其他任何东西!)的应用程序。我知道工具链在我们的应用程序中留下了一个 stub ,它将由动态链接器填充。够了!

我没有得到的:

1) stub 会是什么样子(我知道这样说很奇怪)?我可以 猜测它是我们应用程序的入口点,但它是我们所说的 后门

2) 假设我们正在寻找函数 printf() 的目标代码但是 我们链接到的动态库,比如 mylib.dll 包含对象 printf() 的代码,但不限于此。当链接发生时 链接器足够聪明,可以单独或将复制 printf() 的目标代码 它将整个动态库复制到应用程序?

还是我完全糊涂了?

最佳答案

当您链接 DLL 时,链接器只是在 PE 文件的导入目录中创建一个条目。没有代码复制,因为这会不必要地复制代码。相反,链接器将创建一个条目,告诉 PE 加载器要加载什么。

例如,如果您使用 foo.dll 中的函数 foo_bar,链接器会插入指定要加载的 dll 名称的导入描述符 (IMAGE_IMPORT_DESCRIPTOR) ( foo.dll) 和指定函数名称的函数描述符 (IMAGE_THUNK_DATA) (foo_bar)。编译调用 foo_bar 的代码时,编译器实际上会生成一条指令,该指令会调用 IMAGE_THUNK_DATA 条目中的地址。因此,当您的可执行文件运行时,PE 加载程序将检查导入描述符并加载 foo.dll,然后检查函数描述符并从 foo.dll 中获取这些函数的地址并将地址放入 IMAGE_THUNK_DATA 结构中。之后,控制权转移到您的应用程序并且对 foo_bar 的调用将起作用,因为它现在指向 foo_bar 的地址。

关于c++ - stub 在可执行文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30610456/

相关文章:

c++ - 从函数返回两个 vector 的交集

c - KdTree C 实现导致核心转储

c - 学习C : what's wrong in my pointer code?

c - Valgrind 和分配/释放内存的简单问题

c++ - 将 DLL 与应用程序链接时出现未知错误

Java JNA 无效内存访问

c# - DLL 中的单例类可以跨进程共享吗?

c++ - IoC and Factory for C++ - Microsoft Unity for c# 的替代品

c++ - 用什么替代 Windows 端口上的 glob_t 和 glob()?

c++ - 共享指针递归删除递归数据结构栈溢出