C 针对共享符号名称的库链接的程序运行了错误的实现

C 针对共享符号名称的库链接的程序运行了错误的实现,c,linux,static-linking,dynamic-linking,C,Linux,Static Linking,Dynamic Linking,这有点难理解,但我已经尽力了 在带有gcc 4.4.6和ld 2.20.51的Red Hat 6.4上 我从一个共享库(.so)和一个静态库(.a)链接到一个二进制可执行程序代码中 共享库公开程序直接调用的API。此共享库的实现是针对静态库编译和链接的 静态库还公开了自己的API,该API由程序直接调用。它的一些实现基于直接复制到其中的静态lib1文件的子集 没有一个API(无论是库还是库)实际公开由静态lib1实现的数据类型或函数 因为代码是复制的,所以符号是相同的 在运行期间,我看到了以下行

这有点难理解,但我已经尽力了

在带有gcc 4.4.6和ld 2.20.51的Red Hat 6.4上

我从一个共享库(.so)和一个静态库(.a)链接到一个二进制可执行程序代码中

共享库公开程序直接调用的API。此共享库的实现是针对静态库编译和链接的

静态库还公开了自己的API,该API由程序直接调用。它的一些实现基于直接复制到其中的静态lib1文件的子集

没有一个API(无论是库还是库)实际公开由静态lib1实现的数据类型或函数

因为代码是复制的,所以符号是相同的

在运行期间,我看到了以下行为:

  • 如果链接器的库顺序为共享库静态库,则调用共享库API和调用静态库*API都将使用**static lib1中的实现
  • 如果链接器的库顺序为静态库共享库,则调用共享库API和调用静态库API都将使用静态库1-修改的lib1代码中的实现

  • 如何让对静态库API的所有调用在修改的库1的代码中运行实现,以及共享库API中的调用在静态库1中运行实现?

    请提供用于创建(包括“链接”)共享库的精确命令。此外,如果使用实际的文件名而不是像“lib 1 modified”这样的东西,那么就不会那么混乱了。和往常一样,a是最有用的。请提供用于创建(包括“链接”)共享库的精确命令。此外,如果使用实际的文件名而不是像“lib 1 modified”这样的东西,那么就不会那么混乱了。和往常一样,a是最有用的。