Linux Hexedited共享库';找不到版本x.so';错误
我的库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未找到”我已经阅读了关于符号版本控制之类的内容,但老实说,我不知道在哪里可以找到导致问题的原因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
我检查了readelf,并将一个未编辑的版本与我的版本进行了比较,除了SO名称之外,我在差异中什么也看不到。Elfedit也不起作用,只是将二进制文件转换成垃圾数据。如果运行
readelf-V B.so
,您可能会发现它没有定义versionB.so
,而是定义versionB.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,也可能是你正在分配的结构中的任何变化。