问题标签 [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++ - 静态变量和全局变量在Linux上的动态库和静态库中显示不同的地址?
我在 CentOS 6.5 上遇到过。正如我在网上搜索的那样,静态变量在使用动态库时在 Windows 和 Linux 上的行为不同。也就是说,Windows 会导致变量重复,而 Linux 不会,就像这个: http ://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
但是,当我写了一个小程序来验证这一点时,我发现 Linux 也会导致重复。这是我的小程序,包括四个文件:
(1) 啊
(2) A.cpp
(3) d.cpp
(4) main.cpp
这是我编译和运行程序的方式:
动态部分d.cpp
和静态部分main.cpp
都使用变量a
并在和中b
声明。这是我机器上程序的结果:A.cpp
A.h
这让我很惊讶,因为动态部分和静态部分的全局变量a
和静态变量的地址b
应该是一样的。并且似乎对a
静态部分的修改不会影响a
动态部分。有人可以回答我的问题,或者帮助找出程序中的一些错误(如果有的话)吗?
顺便说一句,老实说,在我正在做的另一个项目中,我发现动态库和静态库中全局变量的地址是相同的。但是那个项目太大了,我不能提供一个小程序来重现这种行为。
非常感谢 !
c - 指向函数段错误的指针
我正在构建一个用户定义的外壳。我有一个指向函数的指针数组——也就是说,一个包含可以在任何时候调用的共享库函数的数组。
我在这里输入定义
我已经调试并确认我将指针放入数组的初始化工作正常,但这是安全措施的代码......
这是发生段错误的地方——当我调用函数时
我的共享库确实将 argv 作为参数——所以我不认为这是问题所在。
正如我所说,调试我看到指针数组充满了地址。我想这可能是一个不正确的地址,但我在这里是一堵砖墙。
有任何想法吗?
所以我测试了指向函数调用的指针,在同一个文件中定义了我自己的函数类型(void *)。
该函数只是将某些内容打印到shell
然后我在execute_function函数中添加了一个条件来强制执行......
它有效WOOHOO!
所以我的动态链接有问题,我看不到。或者使用我的共享库——这不太可能,因为我已经构建了可以与同一项目的另一个 shell 代码一起使用的成功库。
那么,我的动态链接有什么问题?
这是一个示例共享库
c++ - dlsym() 函数返回错误的函数地址(在其他库的 MIPS 存根部分)
我正在开发可以作为插件加载到另一个程序中的共享库(.so)。该程序由一组其他库组成。其中一个库,称为 libA.so,导出自己的实现 ::operator new() 和 ::operator delete()。但我不想使用 new 和 delete 的这种实现,而是使用自己的实现(与我的库静态链接)。一切正常,但 libA.so 具有返回指向已分配内存的指针的功能,我应该通过从 libA.so 调用 operator delete 来释放它。所以,我需要来自 libA.so 的 _ZdlPv 符号的地址。
我正在使用函数 dlsym 获取 _ZdlPv 的地址:dlsym(RTLD_DEFAULT, "_ZdlPv")。我自己的操作符删除(_ZdlPv 符号)实现在我的共享库中的动态符号表中不存在,所以我希望获得在 libA.so 中定义的操作符 delete() 的地址。
但是我从 dlsym 函数得到了完全错误的结果——它返回驻留在其他库 libB.so 中的地址。并且 libB.so 不包含 _ZdlPv 符号的定义,但它需要此符号(在该库中未定义)。dlsym() 返回的地址指向 libB.so 的 .MIPS.stubs 部分。看起来这有点像 PLT(但在 MIPS 架构上——是的,我正在为 MIPS 开发)。当我使用 dlsym 返回的地址调用函数时——线程终止。很难调试...
这里有错吗?为什么 dlsym() 对我不起作用?据我所知, $gp 寄存器保存指向“全局链接表”的指针。每个共享库都有自己的链接表?从存根部分调用函数,gp 应该有正确的值——对吧?当我从其他库(libB.so)的存根部分调用代码时——我用不正确的 $gp 值调用它,因为这个线程崩溃了?
但是为什么 dlsym() 返回指向其他 (libB.so) 库的存根部分中的代码的指针?这是因为我的库的存根部分不包含 _ZdlPv 符号,因为它不存在于我的库的动态符号表中?
如果我的假设是正确的,我不明白,如何在 MIPS 平台上使用 dlsym() 从其他库调用仲裁函数?
c - 为什么这个在运行时加载 .so 的简单 Linux C 程序会崩溃?
我正在尝试编写在运行时加载我的共享对象(.so)的最小程序。
不幸的是,尽管进行了错误检查,它仍会在运行时挂起:-(
我对我在源代码级别忽略的内容非常感兴趣。
源代码和运行我的程序的 shell 会话如下。
文件“libsample.c”:
文件“test.c”:
文件“构建”:
我的外壳会话日志:
任何想法 ?
linker - 有没有办法在运行时检测库是否是静态链接的?
我有一种情况,我分发了一个使用符号插入来处理某些stdlib.h
函数的库,例如malloc
. 我通常只会使用这里描述psymbol = dlsym(RTDL_NEXT,"symbol")
的标准技术。
我有一些用户想要构建静态链接的二进制文件,但RTLD_NEXT
在该上下文中无效——dlsym
不仅在该上下文中失败,它还以RTLD_NEXT 在代码未动态加载中使用而退出。我可以强制这些用户使用此处描述-Wl,--wrap,symbol
的方法,并提供适当的配对,因为无论如何他们都在使用链接到我的库。__real_symbol,_wrap_symbol
pkg-config
始终使用链接器包装解决方案对我来说很好,但是我有一个问题,我的可选库依赖项之一 ( Open MPI
) 也试图包装相同的符号,但正在使用该RTLD_NEXT
方法---这似乎优先在ld
wrap 选项上。
我当然可以实现这两个选项,并在配置dlsym
时静态选择方法(无论如何都阻止链接)。问题是我不确定这将是唯一试图插入我的符号的库。Open MPI
Open MPI
-static
有没有一种方法可以将这两个选项编译到我的库中(即,__real_symbol
用于__wrap_symbol
链接-static
,symbol
和*psymbol
用于dlsym
),在静态链接期间强制-Wl,--wrap,symbol
标志(通过pkg-config --static --cflags
),并动态检查RTLD_NEXT
当前是否可用?这样我就可以构建一个在这两种情况下都可以使用的库。
c++ - 如何以类似于 C 函数的方式将 dlsym 映射到非静态 C++ 成员函数?
我仔细研究并测试了以下 URL,共享库 (Linux) 中的调用函数得到分段错误 以及https://git.xeserv.us/Quora/dlsym-example/src/master/testprog.c。我的问题是如何将 dlsym 映射到类似于此 C 函数示例的非静态 C++ 成员函数。如果我用 C 函数语法代替非静态 C++ 成员函数,我得到一个空操作。
任何帮助表示赞赏。
c - 非动态加载代码的类似 dlsym 的功能?
我知道如何使用dlsym()
来查找由字符串键入的符号 - 当这些符号由我拥有的共享库导出时dlopen()
编辑的共享库导出时。但是 - 其他代码呢?只是我静态链接的目标代码。是否有可能以某种方式查找符号?
笔记:
- 如果有帮助,请对编译和链接过程做出任何合理的假设(例如,哪个编译器、调试信息的存在、PIC 代码等)
- 我对非特定于操作系统的解决方案更感兴趣,但如果重要的话:Linux。
- 涉及功能预注册的解决方案不相关。或者更确切地说,也许他们是,但我宁愿避免这种情况。
ios - 使用 IPA 时未加载 iOS 库
我的代码使用了一个外部库dlsym
(由于我无法控制的原因)。
为了让 Xcode 找到我的库,我必须做两件事:
-force_load "$(SRCROOT)/pathTo/myLibrary.a"
- 死码剥离:否
这在使用调试配置文件运行时工作正常。在模拟器和物理设备上,该库都已加载并可以工作。
但是,如果我创建一个 AdHoc IPA 文件并将其安装在我的设备上,则不再找到相同的库。
有什么区别?
ios - 在我的应用程序之外调整共享框架的方法
我已经为 s 实现了一个 Swizzling 类别,当它们出现时UIViewController
,它就是s:NSlog
显然,这仅在 swizzled 应用程序内工作正常,但我想知道我是否也可以“挂钩”共享presentViewController
,以便在我的应用程序外部呈现视图时调用它。我在想也许可以UIViewController
动态加载dlopen
而不是获取指向它的全局图像符号的指针。可能吗?如果不是——不是吗?
免责声明 - 我这样做是为了在我自己的开发设备上进行调试,并且不会将应用程序上传到 App Store。
c++11 - std::shared_ptr 和 dlopen(),避免未定义的行为
dlopen()
是用于在运行时动态加载共享库的 C 函数。如果您不熟悉,该模式是这样的:
- 打电话
dlopen("libpath", flag)
去void *handle
图书馆 - 打电话从图书馆
dlsym(handle, "object_name")
拿void *object
你想要的东西 - 做你想做的事
object
- 调用
dlclose (handle)
卸载库。
在 C++ 中,这是所谓的别名构造函数的完美用例std::shared_ptr
。模式变为:
- 构造一个
std::shared_ptr<void> handle
将在dlopen("libpath", flag)
调用dlclose()
其析构函数时调用的 std::shared_ptr<void> object
从handle
and构造一个dlsym(handle, "object_name")
- 现在我们可以去
object
任何我们想去的地方,完全忘记handle
;当object
's 的析构函数被调用时,无论何时发生,dlclose()
都会被自动调用
图案精美,效果很好。不过有一个小问题。上面的模式需要从void*
to强制转换whatever_type_object_is*
。如果"object_name"
引用一个函数(考虑到用例,它在大多数情况下都会这样做),这是未定义的行为。
在 C 中,有一个 hack 可以解决这个问题。从dlopen
手册页:
这显然工作得很好,在 C 中。但是有没有一种简单的方法可以做到这一点std::shared_ptr
?