问题标签 [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++ - *.so 使用其他 *.so 的函数时如何使用 dlopen 和 dlsym
我有以下使用 dlopen 和 dlsym 的代码。
主文件
编译命令:g++ main.cpp -ldl
libsql.cpp
libsql.h
编译命令:g++ -fPIC -shared -o libsql.so libsql.cpp
现在,当我运行应用程序时,出现如下错误。
./a.out:符号查找错误:./libsql.so:未定义符号:sqlite3_initialize
但是 libsqlite3 已经安装并且可以与其他程序一起正常工作。
dlopen - dlsym 函数返回类型
我正在使用 dlopen() 加载 libslabhidtouart.so 文件而没有任何错误,但是当我使用 dlsym() 调用函数时,我没有遇到此类过程错误
这是我的代码
/**** 函数 HidUart_GetNumDevices 的返回类型是 int,所以是否有任何转换问题或我的方法签名错误或者还有什么请指导我,我不擅长 c 。
c++ - 跨多个命名空间的动态加载
我完全是新手dlsym
,我刚刚复习了C++ dlopen mini HOWTO 。所以,如果我的概念和方法有误,请纠正我:
我打算编写一个以shared library
名称为参数的应用程序:
./my_app libXYZ.so
不同的输入库使用它们自己的namespaces
来声明恰好具有相似签名的函数:
libXXX.so:
libABC.so:
- 如您所见,函数签名是相同的。
- 需要说明的是,虽然库是 C++ 中的,但我只是在谈论调用
C functions
库中的一些方法,而不是 C++ 成员方法。 - 同样
my_app
应该能够在func()
没有任何其他参数提示的情况下调用。
自然,每个库都包含一个不同的错位 C++ 符号,我无法创建extern "C"
适用于所有人的单个子句(例如):
- $^%X^&Y&^&Zfunc&^arg*&*
- $#$A#$B&^&C&^func*& arg^& ^&
我想到的唯一方法是获取库符号列表,搜索func
子字符串(这很讨厌且容易出错)并extern "C"
使用宏制定子句。你能建议一个更好的解决方案吗?
c - 从使用 dlopen 加载的共享库中引用全局符号
我有一个共享库,我想从主程序访问符号。例如:
main.c
foo.c
我编译并运行如下:
我得到了我期望的输出:
但是,我必须使用dlopen()
anddlsym()
因为我想控制何时加载库。更改的文件是:
main.c
foo.c
我改为编译并运行:
但是,这次我得到了输出
如何从 libfoo 引用主程序中的符号?
c++ - 使用符号表在 C++ 中按名称引用变量
基本上是标题所要求的。
由于对 和符号表等更高级的概念有点不熟悉C++
,我已经在网上对其进行了研究,但我正在努力寻找实现我最终目标的任何方向。我见过的大多数教程都适合 C 语言,而我发现的最接近的问题(here)让我陷入了困境,因为我尝试编译它,但我没有得到想要的结果,而且我我对如何工作还不太extern "C"
确定。
最后,我希望能够从符号表中访问一个变量,并更改该变量。我玩过nm
and objdump
(并且来自硬件背景,看起来很酷),我研究了dlsym
,dlopen
等,但我不确定这对我有什么帮助(特别是因为我已经看到它使用过在 C 中比其他任何东西都多)。
任何建议或小段代码(这样我就可以编写自己的示例程序)都会很棒。补充一下,这是在一个带有过时版本的 G++ 的 Linux 系统上(我现在不在机器上,所以我没有那个信息),我现在无权升级它。
c++ - 在共享库中定义抽象类的接口
假设我有一个这样定义的抽象基类:
接口.hpp
然后我将一个翻译单元编译test.cpp
成一个共享对象test.so
:
测试.cpp
如果我在可执行文件中打开该共享对象并尝试get_interface
像这样调用:
(假装我做了错误检查)
行为是否明确定义?还是我假设这将永远有效,从而踩到自己的脚趾?
请记住,我只会使用 clang 和 gcc
c - 使用 dlsym() 时进行强制转换
我正在使用dlsym()
in并且我有一个问题,是否应该显式转换C
的返回值或者是否正确地隐式转换。dlsym()
这是功能:
该函数compile()
不接受值并返回一个指向函数的指针,该函数将两个double
s 作为输入并返回一个双精度值。然后我设置了一个编译共享对象的系统调用foo.so
。然后我打开foo.so
. dlopen()
然后dlsym()
找到foo
并foo.so
返回一个类型的对象foo
,我在标题中定义为:
我必须投dlsym()
吗?
java - dlsym 以无限循环结束
我正在尝试构建一个 Linux 库 (*.so) 以在 Java 应用程序中使用它。这个库本身加载一个带有本机函数的 dll 文件。
这是我的 C++ 代码:
}
代码编译wineg++ -shared lib.cpp -o libexports.so -Wl,--no-as-needed -ldl
没有错误。
Java 应用程序在循环中打印出“Loading Symbol...”,然后在没有任何消息的情况下终止。我可以确定这与 dlsym() 有关。
nm -D lib.so
我可以查看 lib.so 内部。函数 GetDllVersion() 确实是这个库中的一个符号。
有人能告诉我为什么会有一个无限循环并且 Java VM 正在终止吗?
问候乌尔米
c - 使用包含正确标头的编译时,带有后缀“$UNIX2003”的符号损坏
我想知道当我的代码运行“系统”函数时调用了哪个符号。
在我的示例代码中,当特别包含标头 stdlib.h 时,该符号称为 _system$UNIX2003,当不包含标头时,(可能)默认符号名为 _system(没有后缀 $UNIX2003)
下图显示了我的实验结果:
为什么我们有不同的系统符号?无论如何在运行时检测正确的符号(我尝试使用 dlsym,但我需要包含动态库的句柄,但无法弄清楚我是否应该使用 dlopen 加载库)?
编辑:只有在 32 位拱形下编译时,我才会出现这种奇怪的符号修饰。
EDIT2:有人建议我使用隐式函数指针来获取正确符号的地址。但除非我在我的代码中专门调用该函数,否则它将不起作用。否则,我会收到使用未声明的标识符“系统”的编译错误
objective-c - 如何使用 dlsym 获取 Objective-C 方法的函数指针
我在网上找不到任何使用 dlsym 加载 Objc 方法符号的示例。
虽然我可以上课,
dlsym(handler, "OBJC_CLASS_$_CLLocationManager")
但我不知道如何获得方法符号。