问题标签 [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 - dlsym() 返回符号的奇怪地址
1)。直接打印函数地址:
2)。dlsym 版本:
但
3)。其他:
我怎样才能strerror_r=0x8049e20
使用dlsym()
?
我已经先打印了strerror_r的地址,然后调用dlsym()。
strerror_r=0xb76544e0 是错误的地址,我用这个地址调用 strerror_r 什么都不做。
c - 如何在 C 中访问(动态分配的)Fortran 数组
我的主要问题是为什么数组会做如此奇怪的事情,以及是否有任何方法可以以“干净”的方式执行以下操作。
我目前有一个 C 程序通过foo.c
连接 Fortran 程序,大致如下面的代码所示:bar.f90
dlopen/dlsym
富.c:
bar.f90:
运行主要产量
这表明 Fortran 正确地分配了数组,甚至正确地存储了给定的值,但是它们不再可以通过 dlsym 访问(处理该数据会导致段错误)。我也对固定大小的数组进行了尝试——结果保持不变。
有谁知道这种行为的原因?就我个人而言,我希望事情要么双向解决,要么根本不解决——这个“Fortran 接受 C 数组,但反之不行”让我想知道我在以这种方式从 C 访问数组时是否犯了一些基本错误。
另一个(甚至更重要的)问题是,如何以“正确的方式”进行数组访问。目前我什至不确定坚持“Fortran as .so”界面是否是一个好方法——我认为在这种情况下也可以尝试混合编程。尽管如此,数组问题仍然存在 - 我读到这可以使用 ISO C 绑定以某种方式解决,但我不知道如何解决(我还没有使用 Fortran 进行很多工作,尤其是没有使用所述绑定) ,所以在这个问题上的帮助将不胜感激。
编辑:
好的,所以我更多地阅读了 ISO C Binding 并在这里找到了一个非常有用的方法。使用C_LOC
我可以获得指向我的 Fortran 结构的 C 指针。不幸的是,指向数组的指针似乎是指向指针的指针,需要在 C 代码中取消引用,然后才能将它们视为 C 数组 - 或类似的东西。
编辑:
至少在大多数情况下,我的程序现在可以按照 Vladimir F 指出的方式使用 C 绑定来工作。C 文件和 Fortran 文件现在链接在一起,所以我可以避免使用 libdl 接口,至少对于 Fortran 部分 - 我仍然需要加载动态 C 库,获取指向其中一个符号的函数指针并传递它作为指向 Fortran 的函数指针,后者随后将该函数作为其计算的一部分调用。正如所说的函数需要 double*s [arrays],奇怪的是,我无法使用 C_LOC 传递我的 Fortran 数组 - 既没有C_LOC(array)
也没有C_LOC(array(1))
将正确的指针传递回 C 函数。array(1)
虽然成功了。可悲的是,这不是做到这一点的“最干净”的方式。如果有人提示我如何使用C_LOC
功能,那就太好了。尽管如此,我接受 Vladimir F 的回答,因为我认为这是更安全的解决方案。
c - pthread_cond_broadcast 被 dlsym 破坏?
我正在尝试使用 LD_PRELOAD 机制插入对 pthread_cond_broadcast 的调用。我插入的 pthread_cond_broadcast 函数只是调用了原始的 pthread_cond_broadcast。但是,对于一个同时调用 pthread_cond_wait 和 pthread_cond_broadcast 的非常简单的 pthread 代码,我要么在 glibc 中出现段错误(对于 glibc 2.11.1),要么程序挂起(对于 glibc 2.15)。有什么线索吗?
插入代码(编译为共享库):
简单的 pthread 程序:
编辑:
对于 glibc 2.11.1,gdb bt 给出:
编辑2:
(已解决)正如 R.. 所建议的那样(谢谢!),问题是在我的平台上 pthread_cond_broadcast 是一个版本符号,而 dlsym 给出了错误的版本。这个博客非常详细地解释了这种情况:http: //blog.fesnel.com/blog/2009/08/25/preloading-with-multiple-symbol-versions/
c++ - 我可以调用带有错误签名的 dlsym() 导入的函数,为什么?
host.cpp 有:
p1.cpp 有:
(我故意留下错误检查)
执行主机时,“fuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu” 打印正确,即使我使用完全不同的函数签名将 void 指针类型转换为符号。
为什么会发生这种情况?不同编译器之间的这种行为是否一致?
c - 将参数传递给共享函数 - C
我曾经dlopen
加载一个对象并dlsym
获取一个指向共享对象函数的函数指针。一切正常。我已经测试了它调用然后共享函数(现在)只打印并且它在调用它的主程序中可以正常打印。现在我想将两个参数传递给这个函数。Anint
和 a char *
. 谁能帮我理解如何将参数传递给共享函数?我在网上搜索过,但我不明白它是如何工作的。
linux - 为什么 dlsym() 返回的符号的值可以为空?
在 Linux 中。根据 dlsym(3) Linux 手册页,
为什么会这样,什么时候一个符号(特别是对于一个函数)实际上是 NULL?我正在查看代码,发现了一段使用 dlerror 先清理,然后使用 dlsym,然后使用 dlerror 检查错误。但它不会在调用它之前检查结果函数是否为空:
- dlerror();
- a_func_name = ...dlsym(...);
- if (dlerror()) 转到结束;
- a_func_name(...); // 从不检查 a_func_name == NULL;
我只是一个审阅者,所以没有添加检查的选项。也许作者知道 NULL 永远无法返回。我的工作是挑战这一点,但不知道什么可以使它返回有效的 NULL,因此我可以检查在此代码的上下文中是否可以满足这样的条件。没有找到合适的东西来谷歌阅读,一个好的文档的指针就足够了,除非你想明确地解释哪个会很棒。
python - 通过 dlsym cython 传播异常
我无法通过 dlsym 传播异常。我使用 dlsym 加载一个 cythonized python 文件。我在下面做了一个最小的工作示例,因此您可以自己尝试:
我有一个 pyx 文件 c_fun.pyx,我使用 Cython 将其编译为 C 文件。然后我使用 dlsym 在另一个程序中加载 so 文件,比如 use_fun.c++。您可以使用 ./compile.sh 来编译文件。在执行 ./test 时,程序因分段错误而崩溃。
最初,我尝试在函数末尾不使用“except*”,也没有使用“-fexceptions”编译器标志。但是添加这些并不会改变行为。gdb 甚至不允许我回溯问题,并说:“找不到新线程:通用错误”。我在互联网上查看了与 dlsym 结合使用的异常处理,但发现的信息很少。
故事的其余部分:为了使它更复杂,实际上这个 use_fun.c++ 文件是我导入的 Python 模块。所以:我正在使用 Python 加载模块 use_fun,并在该 C++ 模块中调用 _myfunction。但同样,我无法正确处理异常。但是,在那种情况下,我确实成功地使用 gdb 进入 C 代码并看到 PyErr_Format 被成功调用。但是错误不会被触发,也不会在 C++ 代码中被捕获。
请注意,为了能够公开文件 _myfunction,我在 pyx 文件中指定了“public”关键字。没有它,名称修改将导致 dlsym 函数调用失败。我尝试在这两个链接上查找文档:
http://docs.cython.org/src/userguide/external_C_code.html#using-cython-declarations-from-c
http://docs.cython.org/src/userguide/language_basics.html#error-return-values
编辑:我找到了解决方案。我将保留上面的原始问题,以便对其他人有所帮助。基本上有2个问题
1) 当然,由于 C 没有异常,所以在函数上设置 try/catch 是错误的!起作用的是使用 PyErr_Occurred() 检查 Python 中是否发生错误。
2) 由于 cython 生成一个模块,因此必须先对其进行初始化,然后才能正确使用它。这意味着:调用 Py_Initialize/Py_Finalize,同时也调用 init_cfun 方法。
解决方案如下图所示:
static-linking - 在静态二进制文件上使用 dlsym
是否有希望dlopen(NULL, ...)
为静态编译的二进制文件运行和获取符号?
例如,如果程序是动态编译的并且我使用-rdynamic
.
但是-static
我收到一条神秘的错误消息:
来源foo.c
如下:
c - dlsym(RTLD_NEXT, "msgctl") 不返回默认版本
如果库定义了同一符号的多个版本,dlsym(RTLD_NEXT, "symbol")
即使旧符号不是默认符号,也会返回旧符号。
例如,libpthread 定义了两个版本的 pthread_cond_broadcast:
- “GLIBC_2.3.2”是与 libpthread 链接时获得的默认版本(不涉及任何 dlsym)。(注意表示默认符号的“@@”)
- “GLIBC_2.2.5”是旧版本
现在,如果我使用 dlsym(RTLD_NEXT, "pthread_cond_broadcast"),我总是得到 GLIBC_2.2.5 版本而不是 GLIBC_2.3.2 版本。当然,可以使用 dlvsym 来获取默认版本,但是如果需要为大量符号执行此操作,并且其中许多符号具有不同的新/旧版本,这将变得复杂。
我明白 RTLD_NEXT 不应该总是返回最新的符号来保持兼容性,但为什么不返回默认符号呢?
有谁知道这背后的基本原理?
c++ - 共享库和成员函数
我在 C++ 中遇到了一个小问题。
所以,我有一个游戏,一种 Snake,我想用三个不同的图形库来做。(如 libsdl.so、libndk.so 和 libQt.so)。
我有以下课程:
显示SDL.hh:
DisplaySDL.cpp:
我有我的界面“IDisplay”:
(我只是把 DisplaySDL.hh 和 DisplaySDL.cpp 因为其他库具有相同的设计模式/功能)
这是加载不同库并创建IDisplay *
对象的代码。:
问题是我的函数 loadLibFromName() 运行良好,它加载了我告诉它的库,但只有当我的任何图形库中都没有任何函数成员时。如果我从我的代码中删除“boucle()”函数,它的效果很好,如下所示:
否则,这就是我尝试加载 lib 时得到的结果:
有什么帮助吗?:)