问题标签 [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.

0 投票
1 回答
609 浏览

c - dlsym() 返回符号的奇怪地址

1)。直接打印函数地址:

2)。dlsym 版本:

3)。其他:

我怎样才能strerror_r=0x8049e20使用dlsym()

我已经先打印了strerror_r的地址,然后调用dlsym()。

strerror_r=0xb76544e0 是错误的地址,我用这个地址调用 strerror_r 什么都不做。

0 投票
2 回答
3495 浏览

c - 如何在 C 中访问(动态分配的)Fortran 数组

我的主要问题是为什么数组会做如此奇怪的事情,以及是否有任何方法可以以“干净”的方式执行以下操作。

我目前有一个 C 程序通过foo.c连接 Fortran 程序,大致如下面的代码所示:bar.f90dlopen/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 的回答,因为我认为这是更安全的解决方案。

0 投票
1 回答
898 浏览

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/

0 投票
4 回答
1460 浏览

c++ - 我可以调用带有错误签名的 dlsym() 导入的函数,为什么?

host.cpp 有:

p1.cpp 有:

(我故意留下错误检查)

执行主机时,“fuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu” 打印正确,即使我使用完全不同的函数签名将 void 指针类型转换为符号。

为什么会发生这种情况?不同编译器之间的这种行为是否一致?

0 投票
1 回答
1114 浏览

c - 将参数传递给共享函数 - C

我曾经dlopen加载一个对象并dlsym获取一个指向共享对象函数的函数指针。一切正常。我已经测试了它调用然后共享函数(现在)只打印并且它在调用它的主程序中可以正常打印。现在我想将两个参数传递给这个函数。Anint和 a char *. 谁能帮我理解如何将参数传递给共享函数?我在网上搜索过,但我不明白它是如何工作的。

0 投票
4 回答
2701 浏览

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,因此我可以检查在此代码的上下文中是否可以满足这样的条件。没有找到合适的东西来谷歌阅读,一个好的文档的指针就足够了,除非你想明确地解释哪个会很棒。

0 投票
0 回答
432 浏览

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 方法。

解决方案如下图所示:

0 投票
1 回答
3501 浏览

static-linking - 在静态二进制文件上使用 dlsym

是否有希望dlopen(NULL, ...)为静态编译的二进制文件运行和获取符号?

例如,如果程序是动态编译的并且我使用-rdynamic.

但是-static我收到一条神秘的错误消息:

来源foo.c如下:

0 投票
2 回答
1211 浏览

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 不应该总是返回最新的符号来保持兼容性,但为什么不返回默认符号呢?

有谁知道这背后的基本原理?

0 投票
1 回答
576 浏览

c++ - 共享库和成员函数

我在 C++ 中遇到了一个小问题。

所以,我有一个游戏,一种 Snake,我想用三个不同的图形库来做。(如 libsdl.so、libndk.so 和 libQt.so)。

我有以下课程:

显示SDL.hh:

DisplaySDL.cpp:

我有我的界面“IDisplay”:

(我只是把 DisplaySDL.hh 和 DisplaySDL.cpp 因为其他库具有相同的设计模式/功能)

这是加载不同库并创建IDisplay *对象的代码。:

问题是我的函数 loadLibFromName() 运行良好,它加载了我告诉它的库,但只有当我的任何图形库中都没有任何函数成员时。如果我从我的代码中删除“boucle()”函数,它的效果很好,如下所示:

否则,这就是我尝试加载 lib 时得到的结果:

有什么帮助吗?:)