Ale*_*all 3 unix gcc shared-libraries
我正在努力重构一套旧的实用程序,并创建一个新服务器,它将使用所有这些服务器的公共代码来统一其功能并允许远程客户端进行外部访问.对于每个实用程序,我将获取服务器所需的代码并将其重构为共享库,以便实用程序和服务器现在都将链接到共享库.由于的方式将这些UTILITES前实现者做事情,他们非常简单,只是复制和粘贴的一切时,他们需要建立一个新的工具,所以有一吨的具有相同签名功能(即回调XML解析器),但在里面做不同的事情.
当我运行已经重构的独立实用程序来链接共享代码时,它们完美地工作.当我尝试使用与给定实用程序具有相同功能的服务器时,服务器正在使用链接到的第一个库中的代码,而不是应该从中获取功能的库.
例如,我有一个由公共xml库解析的设备A,B,C的xml,但是每个设备都有自己的共享库libA,libB,libC,服务器使用它.当我向服务器调用发送XML的设备C,它的使用功能,从力霸"HandleStartElement",而不是在libc中相同名称和签名的功能,即使共享库仅在内部和唐声明这些功能" t共享任何提到这些内部回调的头文件来解析xml.
有人可以向我解释为什么它没有阅读正确的功能,以及如何在将来避免这种情况?
我的服务器makefile有以下标志用于编译主程序:
-I../include -L../lib -lA -lB -lC
Run Code Online (Sandbox Code Playgroud)
每个共享库都使用旁边没有共享库的标志,并且不使用-fPIC.
与-l标志一起使用时,共享库应该像非共享库一样工作,特别是不支持存在多个具有相同名称的函数.你已经有点幸运,服务器运行了.
如果我正确理解您的问题,那么具有相同名称的函数不应在共享库之外"看到".共享库有一个"动态符号表",列出了共享库导出和导入的符号.使用GNU工具,您可以看到其内容nm -D libfoo.so.传统的Unix链接器通过使用目标文件中的所有公共实体(即非static函数和全局变量)来填充该符号表.你想要的是这个符号表的更受控制的构造.如果您的代码使用GNU工具(例如,您在Linux上运行),那么您想阅读本文,特别是第2.2节.简短的故事:ELF格式支持您所追求的内容,并且有几种工具/方法可以实现它.
但是,在你的位置,我会蓬勃发展一些sed基于脚本的脚本来重命名具有唯一名称的违规函数.对原始过度复制贴纸的一些报复行动也可能是有序的.
你应该用-fPIC.-fPIC在某些体系结构上不使用共享库是一个致命的错误.由于您的代码没有崩溃,我想您在x86硬件上运行.