问题标签 [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 回答
306 浏览

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.cppA.h

这让我很惊讶,因为动态部分和静态部分的全局变量a和静态变量的地址b应该是一样的。并且似乎对a静态部分的修改不会影响a动态部分。有人可以回答我的问题,或者帮助找出程序中的一些错误(如果有的话)吗?

顺便说一句,老实说,在我正在做的另一个项目中,我发现动态库和静态库中全局变量的地址是相同的。但是那个项目太大了,我不能提供一个小程序来重现这种行为。

非常感谢 !

0 投票
1 回答
198 浏览

c - 指向函数段错误的指针

我正在构建一个用户定义的外壳。我有一个指向函数的指针数组——也就是说,一个包含可以在任何时候调用的共享库函数的数组。

我在这里输入定义

我已经调试并确认我将指针放入数组的初始化工作正常,但这是安全措施的代码......

这是发生段错误的地方——当我调用函数时

我的共享库确实将 argv 作为参数——所以我不认为这是问题所在。

正如我所说,调试我看到指针数组充满了地址。我想这可能是一个不正确的地址,但我在这里是一堵砖墙。

有任何想法吗?


所以我测试了指向函数调用的指针,在同一个文件中定义了我自己的函数类型(void *)。

该函数只是将某些内容打印到shell

然后我在execute_function函数中添加了一个条件来强制执行......

它有效WOOHOO!

所以我的动态链接有问题,我看不到。或者使用我的共享库——这不太可能,因为我已经构建了可以与同一项目的另一个 shell 代码一起使用的成功库。

那么,我的动态链接有什么问题?

这是一个示例共享库

0 投票
0 回答
634 浏览

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() 从其他库调用仲裁函数?

0 投票
1 回答
453 浏览

c - 为什么这个在运行时加载 .so 的简单 Linux C 程序会崩溃?

我正在尝试编写在运行时加载我的共享对象(.so)的最小程序。

不幸的是,尽管进行了错误检查,它仍会在运行时挂起:-(

我对我在源代码级别忽略的内容非常感兴趣。

源代码和运行我的程序的 shell 会话如下。

文件“libsample.c”:

文件“test.c”:

文件“构建”:

我的外壳会话日志:

任何想法 ?

0 投票
0 回答
84 浏览

linker - 有没有办法在运行时检测库是否是静态链接的?

我有一种情况,我分发了一个使用符号插入来处理某些stdlib.h函数的库,例如malloc. 我通常只会使用这里描述psymbol = dlsym(RTDL_NEXT,"symbol")的标准技术。

我有一些用户想要构建静态链接的二进制文件,但RTLD_NEXT在该上下文中无效——dlsym不仅在该上下文中失败,它还以RTLD_NEXT 在代码未动态加载中使用而退出。我可以强制这些用户使用此处描述-Wl,--wrap,symbol的方法,并提供适当的配对,因为无论如何他们都在使用链接到我的库。__real_symbol,_wrap_symbolpkg-config

始终使用链接器包装解决方案对我来说很好,但是我有一个问题,我的可选库依赖项之一 ( Open MPI) 也试图包装相同的符号,但正在使用该RTLD_NEXT方法---这似乎优先在ldwrap 选项上。

我当然可以实现这两个选项,并在配置dlsym时静态选择方法(无论如何都阻止链接)。问题是我不确定这将是唯一试图插入我的符号的库。Open MPIOpen MPI-static

有没有一种方法可以将这两个选项编译到我的库中(即,__real_symbol用于__wrap_symbol链接-staticsymbol*psymbol用于dlsym),在静态链接期间强制-Wl,--wrap,symbol标志(通过pkg-config --static --cflags),并动态检查RTLD_NEXT当前是否可用?这样我就可以构建一个在这两种情况下都可以使用的库。

0 投票
1 回答
1620 浏览

c++ - 如何以类似于 C 函数的方式将 dlsym 映射到非静态 C++ 成员函数?

我仔细研究并测试了以下 URL,共享库 (Linux) 中的调用函数得到分段错误 以及https://git.xeserv.us/Quora/dlsym-example/src/master/testprog.c。我的问题是如何将 dlsym 映射到类似于此 C 函数示例的非静态 C++ 成员函数。如果我用 C 函数语法代替非静态 C++ 成员函数,我得到一个空操作。

任何帮助表示赞赏。

0 投票
1 回答
323 浏览

c - 非动态加载代码的类似 dlsym 的功能?

我知道如何使用dlsym()来查找由字符串键入的符号 - 当这些符号由我拥有的共享库导出时dlopen()编辑的共享库导出时。但是 - 其他代码呢?只是我静态链接的目标代码。是否有可能以某种方式查找符号?

笔记:

  • 如果有帮助,请对编译和链接过程做出任何合理的假设(例如,哪个编译器、调试信息的存在、PIC 代码等)
  • 我对非特定于操作系统的解决方案更感兴趣,但如果重要的话:Linux。
  • 涉及功能预注册的解决方案不相关。或者更确切地说,也许他们是,但我宁愿避免这种情况。
0 投票
1 回答
419 浏览

ios - 使用 IPA 时未加载 iOS 库

我的代码使用了一个外部库dlsym(由于我无法控制的原因)。

为了让 Xcode 找到我的库,我必须做两件事:

  • -force_load "$(SRCROOT)/pathTo/myLibrary.a"
  • 死码剥离:否

这在使用调试配置文件运行时工作正常。在模拟器和物理设备上,该库都已加载并可以工作。

但是,如果我创建一个 AdHoc IPA 文件并将其安装在我的设备上,则不再找到相同的库。

有什么区别?

0 投票
0 回答
188 浏览

ios - 在我的应用程序之外调整共享框架的方法

我已经为 s 实现了一个 Swizzling 类别,当它们出现时UIViewController,它就是s:NSlog

显然,这仅在 swizzled 应用程序内工作正常,但我想知道我是否也可以“挂钩”共享presentViewController,以便在我的应用程序外部呈现视图时调用它。我在想也许可以UIViewController动态加载dlopen而不是获取指向它的全局图像符号的指针。可能吗?如果不是——不是吗?

免责声明 - 我这样做是为了在我自己的开发设备上进行调试,并且不会将应用程序上传到 App Store。

0 投票
3 回答
1688 浏览

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> objecthandleand构造一个dlsym(handle, "object_name")
  • 现在我们可以去object任何我们想去的地方,完全忘记handle;当object's 的析构函数被调用时,无论何时发生,dlclose()都会被自动调用

图案精美,效果很好。不过有一个小问题。上面的模式需要从void*to强制转换whatever_type_object_is*。如果"object_name"引用一个函数(考虑到用例,它在大多数情况下都会这样做),这是未定义的行为。

在 C 中,有一个 hack 可以解决这个问题。从dlopen手册页:

这显然工作得很好,在 C 中。但是有没有一种简单的方法可以做到这一点std::shared_ptr