问题标签 [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 投票
2 回答
2630 浏览

python - 将 Python 扩展 (.pyd) 动态链接到另一个扩展

Python 扩展模块只是动态库,所以我认为可以将 Python 扩展动态链接到另一个。问题在于 Windows Python 扩展被赋予.pyd扩展名而不是.dll,所以当我运行安装脚本时,我无法让 distutils 链接到它们。(我认为这在 UNIX 上不是问题,因为 Python 扩展使用.so文件扩展名。)

假设我有一个bar.pyd需要链接到foo.pyd. 基本上,我在设置脚本中所做的是:

到目前为止,这行不通。这甚至可能吗?我认为是,但我一直无法在网上找到任何东西。我在 Windows 上使用 MinGW,但我希望它可以与不同的 MSVC++ 以及其他系统一起使用。

编辑:以前,我通过将编译时foo.o创建的目标文件(fooextra_objectsfoobar

这似乎不是正确的解决方案,但它确实有效。我不太了解动态链接,所以这可能是正确的方法。不过感觉很不对劲。

然后,我尝试将一些显式参数传递给 gcc 以使其编译导入库:

然后我链接bar到新的导入库:

编译时没有抱怨,但某些符号存在一些问题(具体来说,我有一些全局PyTypeObjectsfoo似乎在 . 中重新定义bar。我需要PyTypeObject两个模块中的 s 引用相同的定义。)。

编辑2:所以,我挑出了问题。在我构建并链接到导入库后,函数符号正确导出,但PyTypeObjects 被重新声明。假设有一个PyTypeOject Foo_Typein foo。我在 中声明了它foo.h,它包含在foo.c和中bar.c

我把它拿出来,把它放在顶部附近foo.c

这在顶部附近bar.c

这解决了问题。然后我可以在两者中使用 Foo_Type,foo并且bar它引用了 Foo_Type 的相同定义。问题是,这不适用于非 Windows 系统。我想如果我只是把__declspecs 拿出来,它会在其他系统上正常工作。

0 投票
2 回答
3638 浏览

c - 在 Windows 上使用 -R 和 -rpath 开关进行链接

我在 Windows XP 上使用 gcc 编译器(MinGW)。libdir.dll我创建了一个 .dll 库,而不是尝试构建使用该库的程序。
我不想将该 .dll 文件放入 System 或 System32 文件夹,也不想在 PATH 变量中设置它的路径,我想要的是将该信息提供给程序本身。
我知道有一个-R-rpath开关可用,所以我打算将它与其中一个链接。

第一个-rpath:
gcc -L /path/ to/lib -Wl,-rpath , /path/to/lib main.o -ldir -o prog

比-R:
gcc -L /path/to /lib -Wl ,-R, /path/to/lib main.o -ldir -o prog

这成功链接到prog但是当我启动程序时 Windows 打印它找不到的消息libdir.dll
所以我的问题是出了什么问题,为什么libdir.dll即使我使用适当的开关,在运行时也不知道路径?

假设我有 prog1 和 prog2,每个都包含自己的 libdir.dll 副本,并且它们都开始同时运行在库中加载代码。内存中发生的情况是加载了两个副本,或者链接器发现有一个副本并将其用于两个程序?
第二个问题是关于如何加载库(任何操作系统)。链接器总是加载整个库还是只加载需要的部分?例如,如果程序引用foo()库中的函数,链接器是否首先仅映射到该函数或整个库的内存?

0 投票
2 回答
3974 浏览

gcc - 共享库如何获得自己的基地址

我有所有符号的偏移地址(通过 libelf 在其自己的二进制 .so 上执行获得)。现在,在运行时,我需要计算所有这些符号的绝对地址,为此我需要获取基地址(加载共享库的位置)并进行计算:

符号地址 = 基地址 + 符号偏移量

共享库如何获得自己的基地址?在 Windows 上,我会使用传递给 DllMain 的参数,在 linux 中是否有一些等价物?

0 投票
4 回答
69223 浏览

c++ - 链接器是做什么的?

我一直想知道。我知道编译器会将您编写的代码转换为二进制文件,但链接器是做什么的?他们对我来说一直是个谜。

我大致了解什么是“链接”。这是对库和框架的引用被添加到二进制文件中的时候。我不明白除此之外的任何事情。对我来说,它“有效”。我也了解动态链接的基础知识,但没有太深。

有人可以解释这些条款吗?

0 投票
3 回答
1766 浏览

c++ - 链接 C++ 动态库时延迟符号绑定失败

我正在用 C++ 编写一个 dylib,但是当我尝试将它链接到我的应用程序时,它在执行时给了我一个错误:

我确保符号没有被剥离,并且

报告该符号存在于库中:

我是从 XCode 内部链接的,所以链接命令有点奇怪。这是 dylib 的链接器命令:

这是测试应用程序的链接器命令:

关于为什么会发生这种情况和/或如何解决它的任何想法?

0 投票
2 回答
203 浏览

c++ - dlopen/etc 无法编译。未解析的符号

我正在探索动态东西的使用。到目前为止,我的程序(main.cpp)不想​​编译,因为dlopen&Co 是“未解决的”。我确实包括dlcfn.h.

我需要尽快得到答案,因为我必须在 30 分钟内回家(还要快速做其他事情)。

正确的错误信息可能是“未定义”,但这不是我的电脑。

0 投票
6 回答
375 浏览

java - 如何验证已编译 Java 代码之间的链接?

一般来说,一组代码(客户端代码)链接到另一组代码(API 代码)。Java 链接通常在编译时在 .java 和 .class 之间或在运行时在 .class 和 .class 之间进行验证。然而,在后一种情况下,验证是在遇到错误引用时进行的(即它是惰性的)。

有没有办法使用编译后的代码一次强制验证客户端代码和 API 代码之间的所有链接?目的是验证客户端代码是否可以与给定版本的 API 一起工作——即使它已经针对另一个版本进行了编译。

(当然一种方法是对 API 进行反编译和重新编译,但有更直接的方法吗?)

0 投票
1 回答
49 浏览

php - 在 php 页面上的动态链接的结果中有一个额外的 /directory/

我又来了。我不想打扰,但这是另一个 zinger。

我有一个定制的购物车,并在页面中有一些动态链接,当在浏览器中提供这些链接时,会将 $name 替换为产品名称,将 $p 替换为 procuct id 号。我的目标是在页面上创建这样的链接:http://www.something.com/buy/ProductName/382793/

我得到的是http://www.something.com/buy/ProductName/0/382793并且没有斜杠。必须有斜线。

代码如下所示:<a title=\"View Product.\" href=\"http://www.something.com/buy/$name/$p/". $line["PID"]. "\">PRODUCT LINKO</a>

您可以看到我的 $name 和 $p 在末尾用斜杠和尾部斜杠分隔,但它不起作用。女士们先生们有什么想法吗?

0 投票
2 回答
1431 浏览

c++ - 动态链接和 Python SWIG (C++) 在 C++ 中工作在 python 中失败

我有一个库,我使用 SWIG 创建了一个 python 包装器。库本身接受用户提供的函数,这些函数位于动态链接的 .so 文件中。目前,我正在处理我自己创建的一个,并设法让动态链接工作......在 C++ 中。当我尝试在 python 中运行它时,我得到未定义的符号错误。这些符号是提供的 .so 文件中不存在但存在于主程序中的符号(本质上它们是允许提供的模块从主程序访问数据的函数)。

在 C++ 中运行一个简短的测试程序时我没有遇到任何错误,但是在 python 中使用这个包装器(以前工作过)的一个简短的测试程序失败了。我想不出为什么它会在 C++ 中失败而不是在 python 中的解释。让我稍微担心的是 C++ 不能正常工作但没有告诉我的想法,并且 python 正在发现 C++ 没有的错误。然而 C++ 返回的结果是准确的,所以这似乎不太可能。

任何想法这是怎么可能的,因此我该如何解决它?

谢谢。

更新:我已将此代码添加到程序的顶部:

这消除了运行时错误,但不幸的是会出现第二个问题(仍然是由于链接)。从作为主程序一部分的动态链接库中调用的函数没有返回正确的值。它们返回 0。更重要的是,它们甚至根本没有运行。问题变成了实际运行的是什么,为什么它与 C++ 不同,我该如何解决?

再次感谢。

更新 - 一个可能更清晰的解释 Python 导入了一个模块,这是我的 C++ 库,已被 SWIG 包装。此 C++ 库使用 dlopen 和 dlsym 从用户提供的 .so 文件中获取函数。用户提供了对作为 C++ 库一部分的函数的文件调用,以便完成它的工作。从 .so 文件到 C++ 库的函数调用是失败的部分,即它们无法调用函数并简单地返回 0。但是,这种失败仅在使用 python 编写测试代码时发生。使用该库的 C++ 测试代码运行良好。

0 投票
1 回答
120 浏览

seo - 中间链接页面,好还是坏?

对于一个非常复杂的网站,我们正在研究如何最好地在页面之间创建内部链接,而无需在渲染页面时创建复杂的逻辑来计算目标页面的 url。

例如,如果我们想链接到www.domain.com/nl/holiday/hotels/holiday-inn/我们正在考虑在两者之间放置一个中间链接页面。像www.domain.com/go/hotel/234这样的东西只会计算正确的 url 路径并转发到目标 url。这使我们无需在正在呈现的页面上进行所有翻译和 slug 计算,从而为我们节省了相当多的资源和麻烦。

这种技术是否有一些我们需要注意的缺点?从技术和 SEO 的角度来看?