5

Wy redefinition of function already present in dynamic library does not throws any compilation and linking error?

In the below function

#include "calc_mean.h"
#include <stdio.h>

int mean(int t, int v) {
  return 0;
}

int main () {
  int theMean = mean(3,6);
  printf("\n  %d\n",theMean);
}

Inside the shared library Definition of mean function already present as below.

#include <stdio.h>
#include "calc_mean.h"

int mean(int a, int b) {
  return (a+b)/2;
}

The definition of mean function is already present in the shared library libmean.so. But during compilation I don't see any redefinition error and compilation is successful.

And on successful execution the o/p I see is 0 instead of 4 so the function definition of mean inside the shared library is not getting executed but the one inside the main module is getting executed.

Why is this happening so?

4

3 回答 3

7

如果在编译/链接过程中尚未找到函数,则链接器仅链接库中的函数。

功能不同的原因是符号的类型不同。库函数是一个弱符号。仅在尚未定义时才包括在内。nm是用于列出对象或可执行文件中的符号的工具。在其手册页中,您可以找到符号类型的列表。

还有一个关于弱符号的维基百科页面。

于 2014-06-24T15:16:38.137 回答
1

对一个外部可见函数有两个定义(即使定义相同,对于非内联函数)会导致未定义的行为,无需诊断。(参考:C99 6.9#5 和附件 J.2)

在 C 中,一些非法代码需要编译器诊断,而有些则不需要。通常不需要诊断的原因是:

  • 要求所有编译器检测和报告错误被认为过于禁止
  • 存在无法诊断的现有系统,标准委员会不想使现有实施不符合标准。

在这种情况下,我的猜测是这是第一种情况;他们想保留编译器/链接器将弱符号实现为扩展的选项,因此他们没有指定编译器必须在此处给出警告。或者实际上通常很难检测到这一点,我从未尝试过编写链接器!

如果未给出诊断,则应将其视为实施质量问题。也许可以将不同的标志传递给您的链接器,以便它拒绝此代码;如果没有,那么您可以放入错误报告或功能请求。

于 2014-06-25T07:43:33.797 回答
-2

您是否正确链接了共享库,因为编译器应该给出错误:

“平均”的多重定义

于 2014-06-24T15:18:51.737 回答