问题标签 [dynamic-linking]

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 回答
368 浏览

qt - 从一台主机到另一台主机的共享库路径不一致

我构建了我的 qt 应用程序,以便它使用的所有 Qt 模块都包含在与可执行文件相同的目录中。它可以在我用来构建应用程序的机器上运行,我确保通过删除除应用程序当前目录之外的所有共享库来测试它。执行 ldd 表明它在当前目录中查找这些库并自行放置可执行文件无法打开可执行文件。所以这一切都很好,但是当我将此目录传输到主机时,它仍然找不到这些库。可能是什么问题呢?

0 投票
3 回答
29584 浏览

c++ - 如何从共享库中调用函数?

从共享库/dll调用函数的最简单和最安全的方法是什么?我最感兴趣的是在 linux 上执行此操作,但如果有一种独立于平台的方式会更好。

有人可以提供示例代码来展示如何进行以下工作,用户已将自己的版本编译foo到共享库中吗?

顺便说一句,我知道如何编译共享库(foo.so),我只需要知道一种在运行时加载它的简单方法。

0 投票
2 回答
2231 浏览

c++ - 在 Debian/squeeze 上的 libstdc++ 中查找缺失的符号

我正在尝试使用作为 .so 文件提供的预编译库。

该文件与一些库动态链接:

不幸的是,在 Debian/squeeze 中,没有 libstdc++-libc6.1-1.so.* 文件。只有 libstdc++6 包提供的 libstdc++.so.* 文件。

我尝试将(使用 ln -s)libstdc++-libc6.1-1.so.2 链接到 libstdc++.so.6 文件。它不起作用,当我试图用这个库来 ld 我的 .o 文件时,似乎缺少一批符号。

你会怎么办 ?我怎样才能找到这些符号是在哪个库中导出的?

0 投票
1 回答
3226 浏览

xcode - 如何确定 OS X dylib 是否与 -flat_namespace 链接

我在我的应用程序中使用了第三方 OS X dylib,并且无法轻松访问其创建者。我想确定它是否与 -flat_namespace 相关联。那可能吗?如果是这样,怎么做?

0 投票
4 回答
221 浏览

c++ - 从 Dock 启动进程与 OS X 上的命令行启动进程有什么区别

我正在调试 OS X 上的一个问题,该问题仅在应用程序从扩展坞启动时发生。从命令行启动应用程序时不会发生这种情况。这两种情况有什么区别?我正在使用的代码是在第三方应用程序中加载的基于 c++ 的捆绑插件。在这两种情况下,我都使用 GDB 附加到进程,我能看到的唯一区别是从命令行运行时在进程中加载​​了几个额外的 dylib,并且我的库的基地址在两种情况。我尝试将链接更改为 -prebind 和/或 -bind_at_load 无济于事。

0 投票
5 回答
6201 浏览

c++ - 构建 python 模块并将其与 MacOSX 框架链接

我正在尝试在 MacOSX 10.6 上构建 Python 扩展并将其链接到多个框架(仅限 i386)。我使用 distutils 和 Extension 对象制作了一个 setup.py 文件。

我为了链接到我的框架,我的LDFLAGS env var 应该如下所示:

由于我在扩展模块文档中没有找到任何“框架”关键字,因此我使用了extra_link_args关键字。

一切都在编译和链接正常。如果我从 extra_link_args 中删除 -framework 行,我的链接器会按预期失败。这是 python setup.py build 生成的最后两行:

不幸的是,我刚刚生成的 .so 无法找到该框架提供的几个符号。我试图用 otool 检查链接的框架。他们都没有出现。

otool 在测试二进制文件上运行的输出,由 g++ 和 ldd 使用我帖子顶部描述的 LDFLAGS 制作。在此示例中,-framework 确实有效。

可以将此问题链接到链接步骤上的“-undefined dynamic_lookup”标志吗?我对在 Google 上找到的几行文档感到有些困惑。

干杯,

0 投票
2 回答
3824 浏览

python - Python ctypes 和动态链接

我正在用 C 编写一些库,其中包含我想通过 ctypes 从 Python 调用的函数。

我已经成功地完成了另一个库,但该库只有非常普通的依赖项(即fstream, math, malloc, stdio, stdlib)。我正在研究的另一个库具有更复杂的依赖关系。

例如,我将尝试使用fftw3. 作为测试,我将尝试编译一个包含以下内容的简单.cpp文件:

我将其编译为:

这一切都有效。现在我用另一个.cpp包含以下文件的文件对其进行测试:

结果:

这是完全合理的。接下来我尝试:

伟大的!但是现在当我尝试使用 ctypes 加载库时:

所以这是同样的问题,但我不知道如何为 ctypes 解决它。我已经尝试了各种事情但没有成功,我现在很困惑。

0 投票
3 回答
1072 浏览

gcc - GCC动态库构建问题

我是 linux 新手,在使用动态库进行编译时出现分段错误错误。

我有两个文件

ctest1.c

ctest2.c

我已使用以下命令将这两个文件编译到名为 libtest.so 的共享库中

我写了另一个程序 prog.c,它使用了这个库导出的函数

程序.c

当我使用以下命令构建可执行文件时

gcc -Wall prog.c -L。-o 编

但是当我运行生成的可执行文件时,我得到了 SegmentationFault 错误。

当我用 ldd 检查 prog 的标题时,它显示

linux-vdso.so.1 => (0x00007f99dff000) libc.so.6 => /lib64/libc.so.6 (0x0007feeaa8c1000) /lib64/ld-linux-x86-64.so.2 (0x00007feeaac1c000)

有人可以告诉问题是什么

0 投票
8 回答
148053 浏览

linux - 执行二进制文件时出现“没有这样的文件或目录”错误

我在 Ubuntu 9.10 x86_64 上安装了一个二进制 Linux 应用程序。该应用程序附带旧版本的 gzip (1.2.4),它是为更旧的内核编译的:

我无法执行这个程序。如果我尝试过,就会发生这种情况:

ldd 对这个二进制文件同样不满意:

我很好奇:这个问题最可能的根源是什么?损坏的文件?还是由于为更旧的 {kernel,libc,...} 构建而导致的二进制不兼容?

根据 nos 的建议,这是以下输出strace ./gzip

这是输出readelf -a ./gzip

0 投票
2 回答
508 浏览

c++ - 避免包装 DLL 中的堆栈溢出

我有一个要添加全屏后处理效果的程序。我没有该程序的源代码(它是专有的,尽管开发人员确实向我发送了一份调试符号的副本,.map 格式)。我有编写和工作的效果代码,没有问题。

我现在的问题是将两者联系起来。

到目前为止,我已经尝试了两种方法:

使用 Detours 修改原程序的导入表。这很好用并且保证稳定,但是我与之交谈过的用户对此并不满意,它需要安装(除了提取档案之外),并且存在一些问题,如果使用 Detours 修补程序在条款下是有效的最终用户许可协议。因此,该选项已失效。

另一种选择是传统的 DLL 替换。我已经包装了 OpenGL (opengl32.dll),我需要程序来加载我的 DLL 而不是系统副本(只需将其放入具有正确名称的程序文件夹中,这很容易)。

然后我需要我的 DLL 来加载 Cg 框架和运行时(依赖于 OpenGL)和其他一些东西。当 Cg 加载时,它会调用我的一些函数,这些函数调用 Cg 函数,并且我往往会出现堆栈溢出和无限循环。我需要能够在子目录中包含 Cg DLL 并仍然使用它们的功能(不确定是否可以让我的 DLL 导入表指向子目录中的 DLL)或者我需要动态链接它们(我' d宁愿不这样做,只是为了简化构建过程),迫使他们参考系统文件(不是我的自定义替换)。

整个链条是: 程序加载 DLL A(名为 opengl32.dll)。DLL A 加载 Cg.dll 并动态链接 (GetProcAddress) 到 sysdir/opengl32.dll。我现在需要 Cg.dll 来引用 sysdir/opengl32.dll,而不是DLL A。

这将如何完成? 编辑:如果不使用 GetProcAddress ,这将如何轻松完成?如果没有其他工作,我愿意退回到那个,但如果可能的话,我宁愿不这样做。

Edit2:我刚刚在 MSDN 文档中偶然发现了 SetDllDirectory 函数(在完全不相关的搜索中)。乍一看,这看起来像我需要的。是这样,还是我判断错误?(现在去测试它)

Edit3:我通过做一些不同的事情解决了这个问题。我没有删除 OpenGL32.dll,而是将我的 DLL 重命名为 DInput.dll。它不仅具有必须导出一个函数而不是超过 120 个函数的优点(对于程序、Cg 和 GLEW),我不必担心函数会重新运行(我可以像往常一样链接到 OpenGL) . 为了接听我需要拦截的电话,我使用了 Detours。总而言之,它工作得更好。不过,这个问题仍然是一个有趣的问题(希望将来对其他试图做疯狂事情的​​人有用)。两个答案都很好,所以我还不确定选哪个...