我的 Linux 应用程序 (A) 链接到我没有源代码的第三方共享库 (B)。这个库使用了另一个我没有源代码的第三方共享库(C)。我相信 (B) 使用 dlopen 来访问 (C) 而不是直接链接。我的理由是 (B) 上的 'ldd' 不显示 (C) 并且 objdump -X (B) 显示对 dlopen/dlclose/dlsym 的引用。
我的要求是我需要在我的 (A) 代码中获取一个指向位于 (C) 中的函数 foo() 的函数指针。通常我会为此使用 dlsym ,但我需要传递从 dlopen 返回的句柄,因为 (B) 没有公开这个句柄。
-
对于更大的上下文:我需要修改 (C) 中的函数,以便每次调用其辅助函数 bar()(也位于 (C) 中)时,它还调用具有位于 (A) 中的相同签名的函数相同的参数(基本上将我的代码注入 (C) foo()->bar() 的代码路径。我相信我已经找到了一种使用 gdb 完成此任务的方法,但是为了移植我的 gdb 命令列表,但我'我停留在获取函数指针的步骤上。我也对完成相同任务的替代方案持开放态度,而不是如上所述的确切问题
编辑:写完这篇文章后,我意识到我可以在我的代码中对文件执行另一个 dlopen,并且通过该句柄上的 dlsym 返回的符号应该与通过原始 dlopen 接收到的符号相同,如果我正在阅读 dlopen 手册页正确. 但是,我仍然对更大背景下的建议或帮助感兴趣,如果有更好的方法来解决这个问题