我已经经历了SO question1和 SO 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/