Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Hexedited共享库';找不到版本x.so';错误_Linux_Hex_Shared Libraries_Elf_Dlopen - Fatal编程技术网

Linux Hexedited共享库';找不到版本x.so';错误

Linux Hexedited共享库';找不到版本x.so';错误,linux,hex,shared-libraries,elf,dlopen,Linux,Hex,Shared Libraries,Elf,Dlopen,我的库A依赖于外部库B。当我在A.so上使用ld时,我看到B链接为B.so.10,但在我的计算机上链接为: B.so->B.so.10 B.so.10->B.so.10.5 我试图使一个链接只是B.so和使用什么版本加载符号链接。我已经编辑了A.so并用B.so替换了B.so.10的所有发现,ld链接很好,但是当我尝试dlopen A.so时,它会说:“加载A.so时出错:版本B.so未找到”我已经阅读了关于符号版本控制之类的内容,但老实说,我不知道在哪里可以找到导致问题的原因 我检查了read

我的库A依赖于外部库B。当我在A.so上使用ld时,我看到B链接为B.so.10,但在我的计算机上链接为:

B.so->B.so.10

B.so.10->B.so.10.5

我试图使一个链接只是B.so和使用什么版本加载符号链接。我已经编辑了A.so并用B.so替换了B.so.10的所有发现,ld链接很好,但是当我尝试dlopen A.so时,它会说:“加载A.so时出错:版本B.so未找到”我已经阅读了关于符号版本控制之类的内容,但老实说,我不知道在哪里可以找到导致问题的原因


我检查了readelf,并将一个未编辑的版本与我的版本进行了比较,除了SO名称之外,我在差异中什么也看不到。Elfedit也不起作用,只是将二进制文件转换成垃圾数据。

如果运行
readelf-V B.so
,您可能会发现它没有定义version
B.so
,而是定义version
B.so.10

通过将所有
B.so.10
字符串替换为
B.so
可以向运行时加载程序声明
A.so
依赖于版本
B.so
,而不是它过去依赖的
B.so.10

因为运行时不存在这样的版本,所以加载程序会正确地进行投诉

我检查了readelf,并将一个未编辑的版本与我的版本进行了比较,除了SO名称之外,我在差异中什么也看不到

再查一遍。具体而言,请执行以下操作:

diff <(readelf -V A.so.orig) <(readelf -V A.so)

diff我明天早上会调查一下,看看进展如何,谢谢!最初的问题是我试图使我的软件CUDA版本不可知。能够将其放到任何系统上并运行。特别是引起问题的库是cuda库的libcuft。我不能把这个二进制文件放到另一个系统上,使用不同的袖口版本作为袖口链接到特定的版本,即使ABI没有永远改变。如果soversion改变了(或者它的一个依赖项的soversion改变了),它的ABI不太可能没有改变。这不仅仅是你直接看到的ABI,也可能是你正在分配的结构中的任何变化。