English 中文(简体)
利用共享图书馆错误功能的统一方案
原标题:Unix program using the wrong function from shared libraries

我正在重构一套旧的实用程序,并创建一个新的服务器,该服务器将使用所有实用程序中的公共代码来统一其功能并允许远程客户端进行外部访问。 对于每个实用程序,我将需要用于服务器的代码提取出来重构为共享库,以便实用程序和服务器现在都将链接到共享库。 由于这些实用程序的前任实现者所做的方式,每当他们需要创建新的实用程序时,他们几乎只是复制和粘贴了所有东西,因此有大量具有相同签名(即用于 XML 解析器的回调)但内部执行不同任务的函数。

当我运行已经重构为与共享代码链接的独立实用程序时,它们运行得非常完美。当我尝试使用具有相同功能的服务器作为特定实用程序时,服务器使用的是链接的第一个库中的代码,而不是应该从中获取功能的库。

例如,我有设备A、B、C的xml,这些xml由一个通用的xml库解析,但每个设备都有自己的共享库libA、libB、libC,服务器使用这些库。当我调用服务器发送设备C的xml时,它使用libA中的HandleStartElement函数,而不是libC中具有相同名称和签名的函数,尽管共享库仅在内部声明这些函数,并且不共享任何包含用于解析xml的内部回调的标题。

有些人能否向我解释为什么不阅读适当的职能,以及今后如何避免这样做?

我的服务器makefile中,编译主程序需要使用以下标志:

-I../include -L../lib -lA -lB -lC

每个共享库几乎没有使用共享库的标志,并且没有使用-fPIC。

最佳回答

在使用<代码>-l的旗帜时,共享的图书馆应像非共享的图书馆一样工作,特别是不会支持以相同名称设置若干职能。 您已经感到,服务器完全运行。

如果我正确理解您的问题,那么具有相同名称的函数并不打算在共享库之外被“看到”。共享库具有“动态符号表”,其中列出了共享库导入和导出的符号。使用GNU工具,您可以使用nm -D libfoo.so查看其内容。传统的Unix链接器通过使用对象文件中的所有公共实体(即,非static函数和全局变量)来填充该符号表。您在此处想要的是更加可控的符号表构建。如果您的代码使用GNU工具(例如,您正在运行Linux),则需要阅读此文章,尤其是第2.2节。简而言之:ELF格式支持您想要的内容,并且有几种工具/方法可以实现。

然而,在你的位置,我会编写一些基于sed的脚本以重命名这些有问题的函数为唯一的名称。对原始过度复制者采取一些报复性的行动也是必要的。

你应该使用-fPIC。在某些架构上不使用-fPIC用于共享库是致命的错误。由于您的代码没有崩溃,我想你在x86硬件上运行。

问题回答

暂无回答




相关问题
gcc -fPIC seems to muck with optimization flags

Following along from this question: how-do-i-check-if-gcc-is-performing-tail-recursion-optimization, I noticed that using gcc with -fPIC seems to destroy this optimization. I am creating a shared ...

Generate assembler code from C file in linux

I would like to know how to generate assembler code from a C program using Unix. I tried the gcc: gcc -c file.c I also used firstly cpp and then try as but I m getting errors. I m trying to build an ...

Getting rid of pre-compiled headers

OK, I have old Metrowerks code for Mac and Windows where the previous developer used pre-compiled headers for every project that this code base builds. How does one get rid of Pre-compiled headers, ...

Include a .txt file in a .h in C++?

I have a number of places where I need to re-use some template code. Many classes need these items In a .h could I do something like: #include <xxx.txt> and place all of this code in the ....

How to compile for Mac OS X 10.5

I d like to compile my application for version 10.5 and forward. Ever since I upgraded to Snow Leopard and installed the latest XCode, gcc defaults to 10.6. I ve tried -isysroot /Developer/SDKs/...

热门标签