两个linux共享对象之间的冲突定义了相同的函数名

两个linux共享对象之间的冲突定义了相同的函数名,第1张

概述我的问题涉及 Python,Qt,PyQt和其他东西,但问题实际上是Linux的ld.so实际上是如何工作的. 问题 如果一个程序加载两个不同的共享库,它们都有相同的入口点名称(即它们都定义了一个具有相同名称和签名的函数),它怎么能告诉它调用哪个版本? 我的问题 我有一个第三方,专有的Linux应用程序,用C语言编写(尽管原始语言无关紧要),并且它与Qt3.3动态链接.该应用程序嵌入了一个pyth 我的问题涉及 Python,Qt,PyQt和其他东西,但问题实际上是linux的ld.so实际上是如何工作的.

问题

如果一个程序加载两个不同的共享库,它们都有相同的入口点名称(即它们都定义了一个具有相同名称和签名的函数),它怎么能告诉它调用哪个版本?

我的问题

我有一个第三方,专有的linux应用程序,用C语言编写(尽管原始语言无关紧要),并且它与Qt3.3动态链接.该应用程序嵌入了一个python解释器,可用于为其编写脚本.

您甚至可以使用应用程序的嵌入式python而不是原始的python使用如下命令:

/path/to/the/program/python

它显示以下内容:

Python 2.7.1 (r271:86832,Sep 16 2011,18:16:32) [GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2Type "help","copyright","credits" or "license" for more information.>>>

使用gcc 4.1.2我已经从源代码构建并安装了PyQt4,而不是系统也有的Qt4库.我相信构建是成功的,因为我可以使用以下命令运行一个小的PyQt4应用程序:

/path/to/the/program/python mypyqtapp.py

但是,如果我用它的GUI加载程序并加载相同的脚本,它会在第一次PyQt4调用时崩溃,这是QApplication类的实例化.

由于python环境是相同的,我怀疑它可能是Qt3和Qt4之间的某种共享库冲突.但是,命令strace -e trace = file表明python正在定位并在两种情况下加载正确的Qt4库.

所以,我的问题是,如果一个程序加载两个共享不同的库来定义相同的函数,它如何知道它正在调用正确的函数? linux加载器ld.so是否以某种方式限定了带有文件名的入口点?我怀疑我的问题可能在那里,应用程序最终加载了两个不同的QApplication实例并且它调用了错误的实例,但是ld.so实际上如何在内部工作逃脱了我.

也许我的问题是由完全不同的东西引起的.

谢谢.

解决方法 仅在链接(ld)阶段检测到冲突符号,加载程序(ld-linux.so)不检查冲突符号.

当多个库提供重复的符号时,使用首先加载的符号.

实际上有人可以利用这个功能.通过提供LD_PRELOAD = overwrite.so,overwrite.so可以覆盖程序所需的任何函数.

总结

以上是内存溢出为你收集整理的两个linux共享对象之间的冲突定义了相同的函数名全部内容,希望文章能够帮你解决两个linux共享对象之间的冲突定义了相同的函数名所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1019663.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存