问题标签 [dlsym]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 在共享库中填充全局函数指针(Solaris、Sun Studio)
我正在围绕 Fortran 95 库创建一个小型 C++ 包装共享库。由于 Fortran 符号包含.
在符号名称中,因此我必须使用dlsym
将 Fortran 函数加载到 C++ 函数指针中。
目前,我在头文件中有一堆全局函数指针:
我将它们填充到相应的 C++ 文件中:
问题:
- 如果我这样做,这些指针何时填充?
- 我可以假设它们被加载到我加载这个库的可执行文件中吗?
- 特别是,我可以在我的可执行文件或其他库中静态创建的对象中使用这些函数吗?或者这是否受到静态初始化命令失败的影响?
- 如果上述方法不正确,那么填充这些指针以便它们可以在可执行文件和其他库中的静态对象中使用的最优雅的方法是什么?
我在 Solaris 上使用 Sun Studio 编译器,如果这会有所不同,但我也对 Linux 上的 GCC 解决方案感兴趣。
c - dlopen 问题(OSX)
我有一个主应用程序,它dylib
从内部动态加载一个 ,dylib
我想从我的主程序中调用导出的函数。我dlopen(NULL,flag)
用来检索我的主要应用程序 handle
并dlsym(handle, symbol)
获取function
.
dlopen
给了,no error
但是当我尝试dlsym
我的时候,function
我得到了以下信息error
:
该符号已导出,经nm确认已更正,
我不确定为什么RTLD_NEXT
会出现这种情况?这是结果dlopen(NULL,flag)
吗?
我怎样才能解决这个问题或实现我的目标?
还是有其他方法可以调用主应用程序(最好不是通过将函数指针传递给 dylib)?
提前致谢!
添加:
出口:
nm的结果
dylib中的代码:
c - dlsym -- 获取被覆盖的符号
我有一个动态加载库的应用程序,它动态加载库...
在 Windows 中,我可以遍历所有加载的模块以查找我感兴趣的符号。不知道如何在 Unix/Linux 环境中执行此操作。我知道我可以对前两个符号使用dlsym(dlopen(0, flag))
ordlsym(RTLD_DEFAULT / RTLD_NEXT)
并且知道要搜索的模块的顺序——我怎样才能更深入并获得给定符号的所有定义?
c - 通过 dlsym 覆盖 FSGetCatalogInfo
我正在尝试使用 DYLD_INSERT_LIBRARIES 在 OS X Lion 10.7 下覆盖 FSGetCatalogInfo 函数,并且一切正常,直到我实际调用原始 FSGetCatalogInfo 函数,此时我得到“总线错误:10”。
我的代码片段是:
我在想我必须定义或调用原始的 FSGetCatalogInfo 错误,但我无法弄清楚我到底在哪里搞砸了 - 想法?
python - 无法使用 LD_PRELOAD 拦截 PyDict_New
我正在尝试使用 LD_PRELOAD 来拦截 PyDict_New 函数。我已经验证了这个配方在 python 解释器中与 getpid 一起工作,并且我已经对其进行了调整以使用 PyDict_New,但它根本不像我预期的那样工作。虽然我清楚地分配了字典,并且必须使用这个函数,但我的覆盖没有被调用。
我究竟做错了什么?
背景:我正在尝试在一个非常大的系统中调试问题。我发现有一个引用计数错误的字典。我知道第一次分配 dict 的位置,以及问题出现的位置,但我很确定在某个中间时间计数会变坏,并且简单的代码跟踪不会做,因为 dict 被缓存并重用(通过 PyDict_New)由 gc 系统。
c++ - 错误:应忽略的无效值
我正在尝试从动态库中获取函数符号,然后我需要使用新函数指针将我的函数替换为库函数。代码将编写在 c++ 文件中。
我使用了以下步骤,
但是在编译时,我收到了这个“错误:无效值没有被忽略,因为它应该是”错误
我该如何解决上述情况?
谢谢
c - 使用 dlsym 清理函数插入
作为 malloc 包装器,我使用这段经典的代码片段:
Valgrind 很不高兴,因为在程序结束时 dlsym 仍然分配了缓冲区。
我怎样才能释放这些资源?谢谢
c - 动态库函数调用
我有以下代码,它只是从当前目录加载库 test.so 并version
在该库中执行函数。应该返回的是一个字符串。相反,返回的是堆栈中的垃圾(可能是指针位置?)。有谁知道为什么以下代码会失败。
c - 我应该缓存 dlsym 的返回值吗?
我正在使用 POSIX dlopen
/ dlsym
API 在运行时加载动态库,然后按名称从这些库中调用函数。
dlsym
在性能方面存储某处的结果是一个好主意吗?或者 dlsym 是否已经进行了自己的缓存,并且添加另一层是无用的甚至是有害的?函数可能会被调用很多次,但我真的没有办法提前知道哪些函数,或者调用它们的频率。
谢谢!
c++ - 什么是用于破坏 C++ 符号名称的 Linux 实用程序?
我有c++filt
命令去破坏符号,相反的工具是什么工具来破坏符号名称?
如果我想调用dlsym()
一个错位的 C++ 函数名,这将很有用。我宁愿不对代码中的名称进行硬编码,因为由于使用了新的编译器版本或新的编译器品牌,或者目前由于为多个平台编译,它可能会随着时间的推移而改变。
是否有一种编程方式可以在运行时获取表示 C++ 函数的字符串,以便代码独立于编译器?一种可能的方法是在编译时调用一个实用程序,该实用程序为正在使用的编译器执行名称修改,并将适当的修改后的 C++ 符号名称插入到字符串中dlsym()
以供使用。
这是我在此站点上找到的最接近解决方案的解决方案,该解决方案是通过使用固定的 C 样式名称间接到您希望的库中定义的 C++ 符号来完成的dlsym()
,但如果您无法控制该库的内容提供,这不是一个选项。